<?php
/**
 * Generated by amphtml-update.py - do not edit.
 *
 * This is a list of HTML tags and attributes that are allowed by the
 * AMP specification. Note that tag names have been converted to lowercase.
 *
 * Note: This file only contains tags that are relevant to the `body` of
 * an AMP page. To include additional elements modify the variable
 * `mandatory_parent_blacklist` in the amp_wp_build.py script.
 *
 * phpcs:ignoreFile
 */
class AMP_Allowed_Tags_Generated {

	private static $spec_file_revision = 1012;
	private static $minimum_validator_revision_required = 375;

	private static $descendant_tag_lists = array(
		'amp-mega-menu-allowed-descendants' => array(
			'a',
			'amp-ad',
			'amp-carousel',
			'amp-embed',
			'amp-img',
			'amp-lightbox',
			'amp-list',
			'amp-video',
			'b',
			'br',
			'button',
			'col',
			'colgroup',
			'div',
			'em',
			'fieldset',
			'form',
			'h1',
			'h2',
			'h3',
			'h4',
			'h5',
			'h6',
			'i',
			'input',
			'label',
			'li',
			'mark',
			'nav',
			'ol',
			'option',
			'p',
			'path',
			'section',
			'span',
			'strike',
			'strong',
			'sub',
			'sup',
			'svg',
			'table',
			'tbody',
			'td',
			'template',
			'th',
			'time',
			'title',
			'tr',
			'u',
			'ul',
		),
		'amp-nested-menu-allowed-descendants' => array(
			'a',
			'amp-accordion',
			'amp-img',
			'amp-list',
			'b',
			'br',
			'button',
			'col',
			'colgroup',
			'div',
			'em',
			'fieldset',
			'form',
			'h1',
			'h2',
			'h3',
			'h4',
			'h5',
			'h6',
			'i',
			'input',
			'label',
			'li',
			'mark',
			'nav',
			'ol',
			'option',
			'p',
			'path',
			'section',
			'span',
			'strike',
			'strong',
			'sub',
			'sup',
			'svg',
			'table',
			'tbody',
			'td',
			'template',
			'th',
			'time',
			'title',
			'tr',
			'u',
			'ul',
		),
		'amp-story-bookend-allowed-descendants' => array(
			'script',
		),
		'amp-story-cta-layer-allowed-descendants' => array(
			'a',
			'abbr',
			'address',
			'amp-call-tracking',
			'amp-date-countdown',
			'amp-fit-text',
			'amp-font',
			'amp-img',
			'amp-timeago',
			'b',
			'bdi',
			'bdo',
			'blockquote',
			'br',
			'button',
			'caption',
			'cite',
			'circle',
			'clippath',
			'code',
			'data',
			'defs',
			'del',
			'desc',
			'dfn',
			'div',
			'ellipse',
			'em',
			'fecolormatrix',
			'fecomposite',
			'feflood',
			'fegaussianblur',
			'femerge',
			'femergenode',
			'feoffset',
			'figcaption',
			'figure',
			'filter',
			'footer',
			'g',
			'glyph',
			'glyphref',
			'h1',
			'h2',
			'h3',
			'h4',
			'h5',
			'h6',
			'header',
			'hgroup',
			'hkern',
			'hr',
			'i',
			'image',
			'ins',
			'kbd',
			'li',
			'line',
			'lineargradient',
			'main',
			'marker',
			'mark',
			'mask',
			'metadata',
			'nav',
			'noscript',
			'ol',
			'p',
			'path',
			'pattern',
			'pre',
			'polygon',
			'polyline',
			'radialgradient',
			'q',
			'rect',
			'rp',
			'rt',
			'rtc',
			'ruby',
			's',
			'samp',
			'section',
			'small',
			'solidcolor',
			'span',
			'stop',
			'strong',
			'sub',
			'sup',
			'svg',
			'switch',
			'symbol',
			'text',
			'textpath',
			'tref',
			'tspan',
			'title',
			'time',
			'tr',
			'u',
			'ul',
			'use',
			'var',
			'view',
			'vkern',
			'wbr',
		),
		'amp-story-grid-layer-allowed-descendants' => array(
			'a',
			'abbr',
			'address',
			'amp-analytics',
			'amp-audio',
			'amp-date-countdown',
			'amp-experiment',
			'amp-fit-text',
			'amp-font',
			'amp-gist',
			'amp-google-vrview-image',
			'amp-img',
			'amp-install-serviceworker',
			'amp-list',
			'amp-live-list',
			'amp-pixel',
			'amp-timeago',
			'amp-twitter',
			'amp-video',
			'article',
			'aside',
			'b',
			'bdi',
			'bdo',
			'blockquote',
			'br',
			'caption',
			'circle',
			'cite',
			'clippath',
			'code',
			'col',
			'colgroup',
			'data',
			'dd',
			'defs',
			'del',
			'desc',
			'dfn',
			'div',
			'dl',
			'dt',
			'ellipse',
			'em',
			'fecolormatrix',
			'fecomposite',
			'feflood',
			'fegaussianblur',
			'femerge',
			'femergenode',
			'feoffset',
			'figcaption',
			'figure',
			'filter',
			'footer',
			'g',
			'glyph',
			'glyphref',
			'h1',
			'h2',
			'h3',
			'h4',
			'h5',
			'h6',
			'header',
			'hgroup',
			'hkern',
			'hr',
			'i',
			'image',
			'ins',
			'kbd',
			'li',
			'line',
			'lineargradient',
			'main',
			'mark',
			'marker',
			'mask',
			'metadata',
			'nav',
			'noscript',
			'ol',
			'p',
			'path',
			'pattern',
			'polygon',
			'polyline',
			'pre',
			'q',
			'radialgradient',
			'rect',
			'rp',
			'rt',
			'rtc',
			'ruby',
			's',
			'samp',
			'script',
			'section',
			'small',
			'solidcolor',
			'source',
			'span',
			'stop',
			'strong',
			'sub',
			'sup',
			'svg',
			'switch',
			'symbol',
			'table',
			'tbody',
			'td',
			'text',
			'textpath',
			'tfoot',
			'th',
			'thead',
			'time',
			'title',
			'tr',
			'track',
			'tref',
			'tspan',
			'u',
			'ul',
			'use',
			'var',
			'view',
			'vkern',
			'wbr',
		),
		'amp-story-page-attachment-allowed-descendants' => array(
			'a',
			'abbr',
			'address',
			'amp-3d-gltf',
			'amp-3q-player',
			'amp-accordion',
			'amp-audio',
			'amp-beopinion',
			'amp-bodymovin-animation',
			'amp-brid-player',
			'amp-brightcove',
			'amp-byside-content',
			'amp-call-tracking',
			'amp-carousel',
			'amp-dailymotion',
			'amp-date-countdown',
			'amp-embedly-card',
			'amp-facebook',
			'amp-facebook-comments',
			'amp-facebook-like',
			'amp-facebook-page',
			'amp-fit-text',
			'amp-fx-collection',
			'amp-fx-flying-carpet',
			'amp-gfycat',
			'amp-gist',
			'amp-google-document-embed',
			'amp-google-vrview-image',
			'amp-hulu',
			'amp-ima-video',
			'amp-image-slider',
			'amp-img',
			'amp-imgur',
			'amp-instagram',
			'amp-izlesene',
			'amp-jwplayer',
			'amp-kaltura-player',
			'amp-list',
			'amp-live-list',
			'amp-mathml',
			'amp-megaphone',
			'amp-mowplayer',
			'amp-nexxtv-player',
			'amp-o2-player',
			'amp-ooyala-player',
			'amp-pan-zoom',
			'amp-pinterest',
			'amp-playbuzz',
			'amp-powr-player',
			'amp-reach-player',
			'amp-reddit',
			'amp-riddle-quiz',
			'amp-soundcloud',
			'amp-springboard-player',
			'amp-timeago',
			'amp-twitter',
			'amp-video',
			'amp-video-iframe',
			'amp-vimeo',
			'amp-vine',
			'amp-viqeo-player',
			'amp-vk',
			'amp-wistia-player',
			'amp-yotpo',
			'amp-youtube',
			'article',
			'aside',
			'b',
			'bdi',
			'bdo',
			'blockquote',
			'br',
			'button',
			'caption',
			'circle',
			'cite',
			'clippath',
			'code',
			'col',
			'colgroup',
			'data',
			'dd',
			'defs',
			'del',
			'desc',
			'dfn',
			'div',
			'dl',
			'dt',
			'ellipse',
			'em',
			'fecolormatrix',
			'fecomposite',
			'feflood',
			'fegaussianblur',
			'femerge',
			'femergenode',
			'feoffset',
			'figcaption',
			'figure',
			'filter',
			'footer',
			'g',
			'glyph',
			'glyphref',
			'h1',
			'h2',
			'h3',
			'h4',
			'h5',
			'h6',
			'header',
			'hgroup',
			'hkern',
			'hr',
			'i',
			'image',
			'ins',
			'kbd',
			'li',
			'line',
			'lineargradient',
			'main',
			'mark',
			'marker',
			'mask',
			'metadata',
			'nav',
			'ol',
			'p',
			'path',
			'pattern',
			'polygon',
			'polyline',
			'pre',
			'q',
			'radialgradient',
			'rect',
			'rp',
			'rt',
			'rtc',
			'ruby',
			's',
			'samp',
			'section',
			'small',
			'solidcolor',
			'source',
			'span',
			'stop',
			'strong',
			'sub',
			'sup',
			'svg',
			'switch',
			'symbol',
			'table',
			'tbody',
			'td',
			'text',
			'textpath',
			'tfoot',
			'th',
			'thead',
			'time',
			'title',
			'tr',
			'track',
			'tref',
			'tspan',
			'u',
			'ul',
			'use',
			'var',
			'view',
			'vkern',
			'wbr',
		),
	);

	private static $allowed_tags = array(
		'a' => array(
			array(
				'attr_spec_list' => array(
					'border' => array(),
					'data-amp-bind-href' => array(),
					'download' => array(),
					'href' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'ftp',
								'geo',
								'http',
								'https',
								'mailto',
								'maps',
								'bip',
								'bbmi',
								'chrome',
								'itms-services',
								'fb-me',
								'fb-messenger',
								'feed',
								'intent',
								'line',
								'skype',
								'sms',
								'snapchat',
								'tel',
								'tg',
								'threema',
								'twitter',
								'viber',
								'webcal',
								'web+mastodon',
								'wh',
								'whatsapp',
							),
						),
					),
					'hreflang' => array(),
					'media' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'referrerpolicy' => array(),
					'rel' => array(
						'blacklisted_value_regex' => '(^|\\s)(components|dns-prefetch|import|manifest|preconnect|prefetch|preload|prerender|serviceworker|stylesheet|subresource)(\\s|$)',
					),
					'role' => array(),
					'tabindex' => array(),
					'target' => array(
						'value' => array(
							'_blank',
							'_self',
							'_top',
						),
					),
					'type' => array(
						'value_casei' => array(
							'text/html',
							'application/rss+xml',
						),
					),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#links',
				),
			),
		),
		'abbr' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'acronym' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'address' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'amp-3d-gltf' => array(
			array(
				'attr_spec_list' => array(
					'alpha' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'antialiasing' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'autorotate' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'clearcolor' => array(),
					'enablezoom' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'maxpixelratio' => array(
						'value_regex' => '[+-]?(\\d*\\.)?\\d+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-3d-gltf',
					),
				),
			),
		),
		'amp-3q-player' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-id' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-3q-player',
					),
				),
			),
		),
		'amp-accordion' => array(
			array(
				'attr_spec_list' => array(
					'animate' => array(
						'value' => array(
							'',
						),
					),
					'disable-session-states' => array(
						'value' => array(
							'',
						),
					),
					'expand-single-section' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'section',
						),
					),
					'requires_extension' => array(
						'amp-accordion',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-accordion',
				),
			),
		),
		'amp-action-macro' => array(
			array(
				'attr_spec_list' => array(
					'arguments' => array(),
					'execute' => array(
						'mandatory' => true,
					),
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-action-macro',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-action-macro',
				),
			),
		),
		'amp-ad' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'json' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rtc-config' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'template' => array(),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-url' => array(
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'template' => array(),
					'type' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'custom',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_name' => 'amp-ad with type=custom',
					'spec_url' => 'https://github.com/ampproject/amphtml/blob/master/ads/custom.md',
				),
			),
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'data-multi-size' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'json' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rtc-config' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
						'amp-carousel',
						'amp-fx-flying-carpet',
						'amp-lightbox',
						'amp-sticky-ad',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_name' => 'amp-ad with data-multi-size attribute',
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'data-enable-refresh' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'json' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
						'amp-fx-flying-carpet',
						'amp-lightbox',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_name' => 'amp-ad with data-enable-refresh attribute',
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
		),
		'amp-ad-custom' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-ad-custom',
					),
				),
			),
		),
		'amp-addthis' => array(
			array(
				'attr_spec_list' => array(
					'data-product-code' => array(),
					'data-share-media' => array(
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'data-share-url' => array(
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'data-widget-id' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-product-code',
						'data-widget-id',
					),
					'requires_extension' => array(
						'amp-addthis',
					),
				),
			),
		),
		'amp-analytics' => array(
			array(
				'attr_spec_list' => array(
					'config' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-analytics',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-analytics',
				),
			),
		),
		'amp-anim' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'attribution' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'object-fit' => array(),
					'object-position' => array(),
					'src' => array(
						'alternative_names' => array(
							'srcset',
						),
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'data',
								'http',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-anim',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-anim',
				),
			),
		),
		'amp-animation' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'trigger' => array(
						'value' => array(
							'visibility',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'script',
						),
						'mandatory_num_child_tags' => 1,
					),
					'requires_extension' => array(
						'amp-animation',
					),
				),
			),
		),
		'amp-apester-media' => array(
			array(
				'attr_spec_list' => array(
					'data-apester-channel-token' => array(
						'value_regex' => '[0-9a-zA-Z]+',
					),
					'data-apester-media-id' => array(
						'value_regex' => '[0-9a-zA-Z]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-apester-channel-token',
						'data-apester-media-id',
					),
					'requires_extension' => array(
						'amp-apester-media',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-apester-media',
				),
			),
		),
		'amp-app-banner' => array(
			array(
				'attr_spec_list' => array(
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'mandatory_parent' => 'body',
					'requires_extension' => array(
						'amp-app-banner',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-app-banner',
					'unique' => true,
				),
			),
		),
		'amp-audio' => array(
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'artist' => array(),
					'artwork' => array(),
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'controls' => array(),
					'controlslist' => array(),
					'data-amp-bind-album' => array(),
					'data-amp-bind-artist' => array(),
					'data-amp-bind-artwork' => array(),
					'data-amp-bind-controlslist' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'muted' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'preload' => array(
						'value_casei' => array(
							'auto',
							'metadata',
							'none',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'defines_default_height' => true,
						'defines_default_width' => true,
						'supported_layouts' => array(
							2,
							3,
							1,
						),
					),
					'disallowed_ancestor' => array(
						'amp-story',
					),
					'requires_extension' => array(
						'amp-audio',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-audio',
				),
			),
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'artist' => array(),
					'artwork' => array(),
					'autoplay' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'controls' => array(),
					'controlslist' => array(),
					'data-amp-bind-album' => array(),
					'data-amp-bind-artist' => array(),
					'data-amp-bind-artwork' => array(),
					'data-amp-bind-controlslist' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'muted' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'mandatory_ancestor' => 'amp-story',
					'requires_extension' => array(
						'amp-audio',
					),
					'spec_name' => 'amp-story >> amp-audio',
					'spec_url' => 'https://amp.dev/documentation/components/amp-audio',
				),
			),
		),
		'amp-auto-ads' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'amp-auto-ads',
					),
					'requires_extension' => array(
						'amp-auto-ads',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-auto-ads',
				),
			),
		),
		'amp-autocomplete' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-src' => array(),
					'filter' => array(
						'mandatory' => true,
						'value_casei' => array(
							'custom',
							'fuzzy',
							'none',
							'prefix',
							'substring',
							'token-prefix',
						),
					),
					'filter-expr' => array(
						'requires_extension' => array(
							'amp-bind',
						),
					),
					'filter-value' => array(),
					'highlight-user-entry' => array(),
					'inline' => array(),
					'items' => array(),
					'max-entries' => array(),
					'media' => array(),
					'min-characters' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'query' => array(),
					'src' => array(
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'submit-on-enter' => array(),
					'suggest-first' => array(),
					'template' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
						),
					),
					'requires_extension' => array(
						'amp-autocomplete',
					),
					'spec_name' => 'amp-autocomplete',
					'spec_url' => 'https://amp.dev/documentation/components/amp-autocomplete',
				),
			),
		),
		'amp-base-carousel' => array(
			array(
				'attr_spec_list' => array(
					'advance-count' => array(
						'value_regex' => '([^,]+\\s+(-?\\d+),\\s*)*(-?\\d+)',
					),
					'auto-advance' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'auto-advance-count' => array(
						'value_regex' => '([^,]+\\s+(-?\\d+),\\s*)*(-?\\d+)',
					),
					'auto-advance-interval' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'auto-advance-loops' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'data-amp-bind-advance-count' => array(),
					'data-amp-bind-auto-advance' => array(),
					'data-amp-bind-auto-advance-count' => array(),
					'data-amp-bind-auto-advance-interval' => array(),
					'data-amp-bind-auto-advance-loops' => array(),
					'data-amp-bind-horizontal' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-mixed-length' => array(),
					'data-amp-bind-slide' => array(),
					'data-amp-bind-snap' => array(),
					'data-amp-bind-snap-align' => array(),
					'data-amp-bind-snap-by' => array(),
					'data-amp-bind-visible-count' => array(),
					'horizontal' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'loop' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'media' => array(),
					'mixed-length' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'slide' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'snap' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'snap-align' => array(
						'value_regex' => '([^,]+\\s+(start|center),\\s*)*(start|center)',
					),
					'snap-by' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'visible-count' => array(
						'value_regex' => '([^,]+\\s+(\\d+(\\.\\d+)?),\\s*)*(\\d+(\\.\\d+)?)',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-base-carousel',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-base-carousel',
				),
			),
			array(
				'attr_spec_list' => array(
					'advance-count' => array(
						'value_regex' => '([^,]+\\s+(-?\\d+),\\s*)*(-?\\d+)',
					),
					'auto-advance' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'auto-advance-count' => array(
						'value_regex' => '([^,]+\\s+(-?\\d+),\\s*)*(-?\\d+)',
					),
					'auto-advance-interval' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'auto-advance-loops' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'data-amp-bind-advance-count' => array(),
					'data-amp-bind-auto-advance' => array(),
					'data-amp-bind-auto-advance-count' => array(),
					'data-amp-bind-auto-advance-interval' => array(),
					'data-amp-bind-auto-advance-loops' => array(),
					'data-amp-bind-horizontal' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-mixed-length' => array(),
					'data-amp-bind-slide' => array(),
					'data-amp-bind-snap' => array(),
					'data-amp-bind-snap-align' => array(),
					'data-amp-bind-snap-by' => array(),
					'data-amp-bind-visible-count' => array(),
					'horizontal' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'lightbox' => array(
						'mandatory' => true,
					),
					'loop' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'media' => array(),
					'mixed-length' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'slide' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'snap' => array(
						'value_regex' => '([^,]+\\s+(true|false),\\s*)*(true|false)',
					),
					'snap-align' => array(
						'value_regex' => '([^,]+\\s+(start|center),\\s*)*(start|center)',
					),
					'snap-by' => array(
						'value_regex' => '([^,]+\\s+(\\d+),\\s*)*(\\d+)',
					),
					'visible-count' => array(
						'value_regex' => '([^,]+\\s+(\\d+(\\.\\d+)?),\\s*)*(\\d+(\\.\\d+)?)',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'reference_points' => array(
						'AMP-BASE-CAROUSEL lightbox [child]' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-BASE-CAROUSEL lightbox [lightbox-exclude]' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
					'requires_extension' => array(
						'amp-lightbox-gallery',
						'amp-base-carousel',
					),
					'spec_name' => 'AMP-BASE-CAROUSEL [lightbox]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-base-carousel',
				),
			),
		),
		'amp-beopinion' => array(
			array(
				'attr_spec_list' => array(
					'data-account' => array(
						'mandatory' => true,
						'value_regex_casei' => '[0-9a-f]{24}',
					),
					'data-content' => array(
						'value_regex_casei' => '[0-9a-f]{24}',
					),
					'data-my-content' => array(
						'value' => array(
							'0',
							'1',
						),
					),
					'data-name' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-beopinion',
					),
				),
			),
		),
		'amp-bind-macro' => array(
			array(
				'attr_spec_list' => array(
					'arguments' => array(),
					'expression' => array(
						'mandatory' => true,
					),
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-bind',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-bind',
				),
			),
		),
		'amp-bodymovin-animation' => array(
			array(
				'attr_spec_list' => array(
					'loop' => array(
						'value_casei' => array(
							'false',
							'number',
							'true',
						),
					),
					'noautoplay' => array(
						'value' => array(
							'',
						),
					),
					'renderer' => array(
						'value_casei' => array(
							'svg',
							'html',
						),
					),
					'src' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-bodymovin-animation',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-bodymovin-animation',
				),
			),
		),
		'amp-brid-player' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-dynamic' => array(
						'value_regex' => '[a-z]+',
					),
					'data-outstream' => array(
						'value_regex' => '[0-9]+',
					),
					'data-partner' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'data-player' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'data-playlist' => array(
						'value_regex' => '.+',
					),
					'data-video' => array(
						'value_regex' => '[0-9]+',
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-outstream',
						'data-playlist',
						'data-video',
					),
					'requires_extension' => array(
						'amp-brid-player',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-brid-player',
				),
			),
		),
		'amp-brightcove' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-account' => array(
						'mandatory' => true,
					),
					'data-amp-bind-data-account' => array(),
					'data-amp-bind-data-embed' => array(),
					'data-amp-bind-data-player' => array(),
					'data-amp-bind-data-player-id' => array(),
					'data-amp-bind-data-playlist-id' => array(),
					'data-amp-bind-data-referrer' => array(),
					'data-amp-bind-data-video-id' => array(),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-brightcove',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-brightcove',
				),
			),
		),
		'amp-byside-content' => array(
			array(
				'attr_spec_list' => array(
					'data-label' => array(
						'mandatory' => true,
					),
					'data-webcare-id' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-byside-content',
					),
				),
			),
		),
		'amp-call-tracking' => array(
			array(
				'attr_spec_list' => array(
					'config' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							6,
							2,
							3,
							7,
							4,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'a',
						),
						'mandatory_num_child_tags' => 1,
					),
					'requires_extension' => array(
						'amp-call-tracking',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-call-tracking',
				),
			),
		),
		'amp-carousel' => array(
			array(
				'attr_spec_list' => array(
					'arrows' => array(
						'value' => array(
							'',
						),
					),
					'autoplay' => array(
						'value_regex' => '(|[0-9]+)',
					),
					'controls' => array(),
					'data-amp-bind-slide' => array(),
					'delay' => array(
						'value_regex' => '[0-9]+',
					),
					'dots' => array(
						'value' => array(
							'',
						),
					),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'slide' => array(
						'value_regex' => '[0-9]+',
					),
					'type' => array(
						'value' => array(
							'carousel',
							'slides',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-carousel',
					),
					'spec_name' => 'AMP-CAROUSEL',
					'spec_url' => 'https://amp.dev/documentation/components/amp-carousel',
				),
			),
			array(
				'attr_spec_list' => array(
					'arrows' => array(
						'value' => array(
							'',
						),
					),
					'autoplay' => array(
						'value_regex' => '(|[0-9]+)',
					),
					'controls' => array(),
					'data-amp-bind-slide' => array(),
					'delay' => array(
						'value_regex' => '[0-9]+',
					),
					'dots' => array(
						'value' => array(
							'',
						),
					),
					'lightbox' => array(
						'mandatory' => true,
					),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'slide' => array(
						'value_regex' => '[0-9]+',
					),
					'type' => array(
						'value' => array(
							'carousel',
							'slides',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'reference_points' => array(
						'AMP-CAROUSEL lightbox [child]' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-CAROUSEL lightbox [lightbox-exclude]' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
					'requires_extension' => array(
						'amp-carousel',
						'amp-lightbox-gallery',
					),
					'spec_name' => 'AMP-CAROUSEL lightbox',
					'spec_url' => 'https://amp.dev/documentation/components/amp-carousel',
				),
			),
		),
		'amp-connatix-player' => array(
			array(
				'attr_spec_list' => array(
					'data-player-id' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-connatix-player',
					),
					'spec_url' => 'https://www.ampproject.org/docs/reference/components/amp-connatix-player',
				),
			),
		),
		'amp-consent' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-consent',
					),
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-consent',
					),
					'spec_name' => 'amp-consent [type]',
					'unique' => true,
				),
			),
		),
		'amp-dailymotion' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-endscreen-enable' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'data-info' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'data-mute' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'data-sharing-enable' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'data-start' => array(
						'value_regex' => '[0-9]+',
					),
					'data-ui-highlight' => array(
						'value_regex_casei' => '([0-9a-f]{3}){1,2}',
					),
					'data-ui-logo' => array(
						'value' => array(
							'false',
							'true',
						),
					),
					'data-videoid' => array(
						'mandatory' => true,
						'value_regex_casei' => '[a-z0-9]+',
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-dailymotion',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-dailymotion',
				),
			),
		),
		'amp-date-countdown' => array(
			array(
				'attr_spec_list' => array(
					'biggest-unit' => array(
						'value_casei' => array(
							'days',
							'hours',
							'minutes',
							'seconds',
						),
					),
					'end-date' => array(
						'value_regex' => '\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d(:[0-5]\\d(\\.\\d+)?)?(Z|[+-][0-1][0-9]:[0-5][0-9])',
					),
					'locale' => array(
						'value_casei' => array(
							'de',
							'en',
							'es',
							'fr',
							'id',
							'it',
							'ja',
							'ko',
							'nl',
							'pt',
							'ru',
							'th',
							'tr',
							'vi',
							'zh-cn',
							'zh-tw',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'offset-seconds' => array(
						'value_regex' => '-?\\d+',
					),
					'template' => array(),
					'timeleft-ms' => array(
						'value_regex' => '\\d+',
					),
					'timestamp-ms' => array(
						'value_regex' => '\\d{13}',
					),
					'timestamp-seconds' => array(
						'value_regex' => '\\d{10}',
					),
					'when-ended' => array(
						'value_casei' => array(
							'continue',
							'stop',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'end-date',
						'timeleft-ms',
						'timestamp-ms',
						'timestamp-seconds',
					),
					'requires_extension' => array(
						'amp-date-countdown',
					),
				),
			),
		),
		'amp-date-display' => array(
			array(
				'attr_spec_list' => array(
					'datetime' => array(
						'value_regex' => 'now|(\\d{4}-[01]\\d-[0-3]\\d(T[0-2]\\d:[0-5]\\d(:[0-6]\\d(\\.\\d\\d?\\d?)?)?(Z|[+-][0-1]\\d:[0-5]\\d)?)?)',
					),
					'display-in' => array(
						'value_casei' => array(
							'utc',
						),
					),
					'locale' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'offset-seconds' => array(
						'value_regex' => '-?\\d+',
					),
					'template' => array(),
					'timestamp-ms' => array(
						'value_regex' => '\\d+',
					),
					'timestamp-seconds' => array(
						'value_regex' => '\\d+',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'datetime',
						'timestamp-ms',
						'timestamp-seconds',
					),
					'requires_extension' => array(
						'amp-date-display',
					),
				),
			),
		),
		'amp-date-picker' => array(
			array(
				'attr_spec_list' => array(
					'allow-blocked-end-date' => array(
						'value' => array(
							'',
						),
					),
					'allow-blocked-ranges' => array(
						'value' => array(
							'',
						),
					),
					'blocked' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-src' => array(),
					'date' => array(),
					'day-size' => array(
						'value_regex' => '[0-9]+',
					),
					'first-day-of-week' => array(
						'value_regex' => '[0-6]',
					),
					'format' => array(),
					'fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'hide-keyboard-shortcuts-panel' => array(
						'value' => array(
							'',
						),
					),
					'highlighted' => array(),
					'input-selector' => array(),
					'locale' => array(),
					'max' => array(),
					'media' => array(),
					'min' => array(),
					'mode' => array(
						'value_casei' => array(
							'static',
						),
					),
					'month-format' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'number-of-months' => array(
						'value_regex' => '[0-9]+',
					),
					'open-after-clear' => array(
						'value' => array(
							'',
						),
					),
					'open-after-select' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'value_casei' => array(
							'single',
						),
					),
					'week-day-format' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-date-picker',
					),
					'spec_name' => 'amp-date-picker[type=single][mode=static]',
				),
			),
			array(
				'attr_spec_list' => array(
					'allow-blocked-end-date' => array(
						'value' => array(
							'',
						),
					),
					'allow-blocked-ranges' => array(
						'value' => array(
							'',
						),
					),
					'blocked' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-src' => array(),
					'date' => array(),
					'day-size' => array(
						'value_regex' => '[0-9]+',
					),
					'first-day-of-week' => array(
						'value_regex' => '[0-6]',
					),
					'format' => array(),
					'hide-keyboard-shortcuts-panel' => array(
						'value' => array(
							'',
						),
					),
					'highlighted' => array(),
					'input-selector' => array(),
					'locale' => array(),
					'max' => array(),
					'media' => array(),
					'min' => array(),
					'mode' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'overlay',
						),
					),
					'month-format' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'number-of-months' => array(
						'value_regex' => '[0-9]+',
					),
					'open-after-clear' => array(
						'value' => array(
							'',
						),
					),
					'open-after-select' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'touch-keyboard-editable' => array(
						'value' => array(
							'',
						),
					),
					'type' => array(
						'value_casei' => array(
							'single',
						),
					),
					'week-day-format' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							1,
						),
					),
					'requires_extension' => array(
						'amp-date-picker',
					),
					'spec_name' => 'amp-date-picker[type=single][mode=overlay]',
				),
			),
			array(
				'attr_spec_list' => array(
					'allow-blocked-end-date' => array(
						'value' => array(
							'',
						),
					),
					'allow-blocked-ranges' => array(
						'value' => array(
							'',
						),
					),
					'blocked' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-src' => array(),
					'day-size' => array(
						'value_regex' => '[0-9]+',
					),
					'end-date' => array(),
					'end-input-selector' => array(),
					'first-day-of-week' => array(
						'value_regex' => '[0-6]',
					),
					'format' => array(),
					'fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'hide-keyboard-shortcuts-panel' => array(
						'value' => array(
							'',
						),
					),
					'highlighted' => array(),
					'locale' => array(),
					'max' => array(),
					'maximum-nights' => array(
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'min' => array(),
					'minimum-nights' => array(
						'value_regex' => '[0-9]+',
					),
					'mode' => array(
						'value_casei' => array(
							'static',
						),
					),
					'month-format' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'number-of-months' => array(
						'value_regex' => '[0-9]+',
					),
					'open-after-clear' => array(
						'value' => array(
							'',
						),
					),
					'open-after-select' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'start-date' => array(),
					'start-input-selector' => array(),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'range',
						),
					),
					'week-day-format' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-date-picker',
					),
					'spec_name' => 'amp-date-picker[type=range][mode=static]',
				),
			),
			array(
				'attr_spec_list' => array(
					'allow-blocked-end-date' => array(
						'value' => array(
							'',
						),
					),
					'allow-blocked-ranges' => array(
						'value' => array(
							'',
						),
					),
					'blocked' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-src' => array(),
					'day-size' => array(
						'value_regex' => '[0-9]+',
					),
					'end-date' => array(),
					'end-input-selector' => array(),
					'first-day-of-week' => array(
						'value_regex' => '[0-6]',
					),
					'format' => array(),
					'hide-keyboard-shortcuts-panel' => array(
						'value' => array(
							'',
						),
					),
					'highlighted' => array(),
					'locale' => array(),
					'max' => array(),
					'maximum-nights' => array(
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'min' => array(),
					'minimum-nights' => array(
						'value_regex' => '[0-9]+',
					),
					'mode' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'overlay',
						),
					),
					'month-format' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'number-of-months' => array(
						'value_regex' => '[0-9]+',
					),
					'open-after-clear' => array(
						'value' => array(
							'',
						),
					),
					'open-after-select' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'start-date' => array(),
					'start-input-selector' => array(),
					'touch-keyboard-editable' => array(
						'value' => array(
							'',
						),
					),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'range',
						),
					),
					'week-day-format' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							1,
						),
					),
					'requires_extension' => array(
						'amp-date-picker',
					),
					'spec_name' => 'amp-date-picker[type=range][mode=overlay]',
				),
			),
		),
		'amp-delight-player' => array(
			array(
				'attr_spec_list' => array(
					'data-content-id' => array(
						'mandatory' => true,
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-delight-player',
					),
				),
			),
		),
		'amp-embed' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'json' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rtc-config' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'data-multi-size' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'json' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rtc-config' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							8,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
						'amp-carousel',
						'amp-fx-flying-carpet',
						'amp-lightbox',
						'amp-sticky-ad',
					),
					'requires_extension' => array(
						'amp-ad',
					),
					'spec_name' => 'amp-embed with data-multi-size attribute',
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
		),
		'amp-embedly-card' => array(
			array(
				'attr_spec_list' => array(
					'data-url' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							4,
						),
					),
					'requires_extension' => array(
						'amp-embedly-card',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-embedly-card',
				),
			),
		),
		'amp-embedly-key' => array(
			array(
				'attr_spec_list' => array(
					'value' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-embedly-card',
					),
					'unique' => true,
				),
			),
		),
		'amp-experiment' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-experiment',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-experiment',
					'unique' => true,
				),
			),
		),
		'amp-facebook' => array(
			array(
				'attr_spec_list' => array(
					'data-href' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-facebook',
					),
				),
			),
		),
		'amp-facebook-comments' => array(
			array(
				'attr_spec_list' => array(
					'data-href' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-facebook-comments',
					),
				),
			),
		),
		'amp-facebook-like' => array(
			array(
				'attr_spec_list' => array(
					'data-href' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-facebook-like',
					),
				),
			),
		),
		'amp-facebook-page' => array(
			array(
				'attr_spec_list' => array(
					'data-href' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-facebook-page',
					),
				),
			),
		),
		'amp-fit-text' => array(
			array(
				'attr_spec_list' => array(
					'max-font-size' => array(),
					'media' => array(),
					'min-font-size' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-fit-text',
					),
				),
			),
		),
		'amp-font' => array(
			array(
				'attr_spec_list' => array(
					'font-family' => array(
						'mandatory' => true,
					),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'on-error-add-class' => array(),
					'on-error-remove-class' => array(),
					'on-load-add-class' => array(),
					'on-load-remove-class' => array(),
					'timeout' => array(
						'value_regex' => '[0-9]+',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-font',
					),
				),
			),
		),
		'amp-fx-flying-carpet' => array(
			array(
				'attr_spec_list' => array(
					'height' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-fx-flying-carpet',
					),
				),
			),
		),
		'amp-geo' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'child_tags' => array(
						'first_child_tag_name_oneof' => array(
							'script',
						),
					),
					'requires_extension' => array(
						'amp-geo',
					),
					'unique' => true,
				),
			),
		),
		'amp-gfycat' => array(
			array(
				'attr_spec_list' => array(
					'data-gfyid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noautoplay' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-gfycat',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-gfycat',
				),
			),
		),
		'amp-gist' => array(
			array(
				'attr_spec_list' => array(
					'data-gistid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							3,
						),
					),
					'requires_extension' => array(
						'amp-gist',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-gist',
				),
			),
		),
		'amp-google-document-embed' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-google-document-embed',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-google-document-embed',
				),
			),
		),
		'amp-hulu' => array(
			array(
				'attr_spec_list' => array(
					'data-eid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-hulu',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-hulu',
				),
			),
		),
		'amp-iframe' => array(
			array(
				'attr_spec_list' => array(
					'allow' => array(),
					'allowfullscreen' => array(
						'value' => array(
							'',
						),
					),
					'allowpaymentrequest' => array(
						'value' => array(
							'',
						),
					),
					'allowtransparency' => array(
						'value' => array(
							'',
						),
					),
					'data-amp-bind-src' => array(),
					'frameborder' => array(
						'value' => array(
							'0',
							'1',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'referrerpolicy' => array(),
					'resizable' => array(
						'value' => array(
							'',
						),
					),
					'sandbox' => array(),
					'scrolling' => array(
						'value' => array(
							'auto',
							'no',
							'yes',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'data',
								'https',
							),
						),
					),
					'srcdoc' => array(),
					'tabindex' => array(
						'value_regex' => '-?\\d+',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'src',
						'srcdoc',
					),
					'requires_extension' => array(
						'amp-iframe',
					),
				),
			),
		),
		'amp-ima-video' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'data-tag' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-ima-video',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-ima-video',
				),
			),
		),
		'amp-image-lightbox' => array(
			array(
				'attr_spec_list' => array(
					'controls' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-image-lightbox',
					),
				),
			),
		),
		'amp-image-slider' => array(
			array(
				'attr_spec_list' => array(
					'disable-hint-reappear' => array(),
					'initial-slider-position' => array(
						'value_regex' => '0(\\.[0-9]+)?|1(\\.0+)?',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'step-size' => array(
						'value_regex' => '0(\\.[0-9]+)?|1(\\.0+)?',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							9,
							1,
							4,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'amp-img',
							'div',
						),
						'mandatory_min_num_child_tags' => 2,
					),
					'requires_extension' => array(
						'amp-image-slider',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-image-slider',
				),
			),
		),
		'amp-img' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'attribution' => array(),
					'data-amp-bind-alt' => array(),
					'data-amp-bind-attribution' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srcset' => array(),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'object-fit' => array(),
					'object-position' => array(),
					'placeholder' => array(),
					'src' => array(
						'alternative_names' => array(
							'srcset',
						),
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'data',
								'http',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-img',
				),
			),
		),
		'amp-imgur' => array(
			array(
				'attr_spec_list' => array(
					'data-imgur-id' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-imgur',
					),
				),
			),
		),
		'amp-inline-gallery' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
						),
					),
					'requires_extension' => array(
						'amp-inline-gallery',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-inline-gallery',
				),
			),
		),
		'amp-inline-gallery-pagination' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'mandatory_ancestor' => 'amp-inline-gallery',
					'requires_extension' => array(
						'amp-inline-gallery',
					),
					'spec_name' => 'amp-inline-gallery-pagination',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inline-gallery',
				),
			),
			array(
				'attr_spec_list' => array(
					'inset' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'mandatory_ancestor' => 'amp-inline-gallery',
					'requires_extension' => array(
						'amp-inline-gallery',
					),
					'spec_name' => 'amp-inline-gallery-pagination [inset]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inline-gallery',
				),
			),
		),
		'amp-inline-gallery-thumbnails' => array(
			array(
				'attr_spec_list' => array(
					'aspect-ratio-height' => array(
						'blacklisted_value_regex' => '^0+(\\.0+)?$',
						'value_regex' => '\\d+(\\.\\d+)?',
					),
					'aspect-ratio-width' => array(
						'blacklisted_value_regex' => '^0+(\\.0+)?$',
						'value_regex' => '\\d+(\\.\\d+)?',
					),
					'loop' => array(
						'value' => array(
							'true',
							'false',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'mandatory_ancestor' => 'amp-inline-gallery',
					'requires_extension' => array(
						'amp-inline-gallery',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-inline-gallery',
				),
			),
		),
		'amp-instagram' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'data-shortcode' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-instagram',
					),
				),
			),
		),
		'amp-install-serviceworker' => array(
			array(
				'attr_spec_list' => array(
					'data-iframe-src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-install-serviceworker',
					),
				),
			),
		),
		'amp-izlesene' => array(
			array(
				'attr_spec_list' => array(
					'data-videoid' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-izlesene',
					),
				),
			),
		),
		'amp-jwplayer' => array(
			array(
				'attr_spec_list' => array(
					'data-media-id' => array(
						'value_regex_casei' => '[0-9a-z]{8}',
					),
					'data-player-id' => array(
						'mandatory' => true,
						'value_regex_casei' => '[0-9a-z]{8}',
					),
					'data-playlist-id' => array(
						'value_regex_casei' => '[0-9a-z]{8}',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-media-id',
						'data-playlist-id',
					),
					'requires_extension' => array(
						'amp-jwplayer',
					),
				),
			),
		),
		'amp-kaltura-player' => array(
			array(
				'attr_spec_list' => array(
					'data-partner' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-kaltura-player',
					),
				),
			),
		),
		'amp-layout' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
							5,
						),
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-layout',
				),
			),
		),
		'amp-lightbox' => array(
			array(
				'attr_spec_list' => array(
					'animate-in' => array(
						'value_casei' => array(
							'fade-in',
							'fly-in-bottom',
							'fly-in-top',
						),
					),
					'controls' => array(),
					'data-amp-bind-open' => array(),
					'from' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'scrollable' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-lightbox',
					),
				),
			),
		),
		'amp-link-rewriter' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'child_tags' => array(
						'first_child_tag_name_oneof' => array(
							'script',
						),
						'mandatory_num_child_tags' => 1,
					),
					'requires_extension' => array(
						'amp-link-rewriter',
					),
					'unique' => true,
				),
			),
		),
		'amp-list' => array(
			array(
				'attr_spec_list' => array(
					'auto-resize' => array(
						'value' => array(
							'',
						),
					),
					'binding' => array(
						'value' => array(
							'always',
							'no',
							'refresh',
						),
					),
					'credentials' => array(),
					'data-amp-bind-is-layout-container' => array(),
					'data-amp-bind-src' => array(),
					'diffable' => array(
						'value' => array(
							'',
						),
					),
					'items' => array(),
					'load-more' => array(
						'value' => array(
							'auto',
							'manual',
						),
					),
					'load-more-bookmark' => array(),
					'max-items' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'reset-on-refresh' => array(
						'value' => array(
							'',
							'always',
							'fetch',
						),
					),
					'single-item' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'template' => array(),
					'xssi-prefix' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_anyof' => array(
						'data-amp-bind-src',
						'src',
					),
					'requires_extension' => array(
						'amp-list',
					),
				),
			),
		),
		'amp-list-load-more' => array(
			array(
				'attr_spec_list' => array(
					'load-more-button' => array(
						'value' => array(
							'',
						),
					),
					'load-more-end' => array(
						'value' => array(
							'',
						),
					),
					'load-more-failed' => array(
						'value' => array(
							'',
						),
					),
					'load-more-loading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_oneof' => array(
						'load-more-button',
						'load-more-end',
						'load-more-failed',
						'load-more-loading',
					),
					'mandatory_parent' => 'amp-list',
					'requires_extension' => array(
						'amp-list',
					),
				),
			),
		),
		'amp-live-list' => array(
			array(
				'attr_spec_list' => array(
					'data-max-items-per-page' => array(
						'mandatory' => true,
						'value_regex' => '\\d+',
					),
					'data-poll-interval' => array(
						'value_regex' => '\\d{5,}',
					),
					'disabled' => array(
						'value' => array(
							'',
						),
					),
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
					'sort' => array(
						'value' => array(
							'ascending',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							3,
						),
					),
					'reference_points' => array(
						'AMP-LIVE-LIST [items]' => array(
							'mandatory' => true,
							'unique' => true,
						),
						'AMP-LIVE-LIST [pagination]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-LIVE-LIST [update]' => array(
							'mandatory' => true,
							'unique' => true,
						),
					),
					'requires_extension' => array(
						'amp-live-list',
					),
				),
			),
		),
		'amp-mathml' => array(
			array(
				'attr_spec_list' => array(
					'data-formula' => array(
						'mandatory' => true,
					),
					'inline' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
						),
					),
					'requires_extension' => array(
						'amp-mathml',
					),
				),
			),
		),
		'amp-mega-menu' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							3,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'nav',
							'amp-list',
						),
						'mandatory_num_child_tags' => 1,
					),
					'descendant_tag_list' => 'amp-mega-menu-allowed-descendants',
					'reference_points' => array(
						'AMP-MEGA-MENU > AMP-LIST' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-MEGA-MENU > NAV' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
					'requires_extension' => array(
						'amp-mega-menu',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-mega-menu',
				),
			),
		),
		'amp-megaphone' => array(
			array(
				'attr_spec_list' => array(
					'data-episodes' => array(
						'value_regex' => '[0-9]+',
					),
					'data-light' => array(
						'value' => array(
							'',
						),
					),
					'data-playlist' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value_regex' => '[A-Za-z0-9]+',
					),
					'data-sharing' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							3,
						),
					),
					'requires_extension' => array(
						'amp-megaphone',
					),
					'spec_name' => 'amp-megaphone [data-playlist]',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-episode' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value_regex' => '[A-Za-z0-9]+',
					),
					'data-light' => array(
						'value' => array(
							'',
						),
					),
					'data-sharing' => array(
						'value' => array(
							'',
						),
					),
					'data-start' => array(
						'value_regex' => '\\d+(\\.\\d+)?',
					),
					'data-tile' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							3,
						),
					),
					'requires_extension' => array(
						'amp-megaphone',
					),
					'spec_name' => 'amp-megaphone [data-episode]',
				),
			),
		),
		'amp-minute-media-player' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-content-id' => array(),
					'data-content-type' => array(
						'mandatory' => true,
						'value' => array(
							'curated',
							'semantic',
							'specific',
						),
					),
					'data-minimum-date-factor' => array(),
					'data-scanned-element' => array(),
					'data-scanned-element-type' => array(
						'value' => array(
							'className',
							'id',
							'tag',
						),
					),
					'data-scoped-keywords' => array(),
					'data-tags' => array(),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-minute-media-player',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-minute-media-player',
				),
			),
		),
		'amp-mowplayer' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-mediaid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-mowplayer',
					),
				),
			),
		),
		'amp-nested-menu' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'side' => array(
						'value' => array(
							'left',
							'right',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
						),
					),
					'descendant_tag_list' => 'amp-nested-menu-allowed-descendants',
					'mandatory_ancestor' => 'amp-sidebar',
					'requires_extension' => array(
						'amp-sidebar',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-nested-menu',
				),
			),
		),
		'amp-next-page' => array(
			array(
				'attr_spec_list' => array(
					'deep-parsing' => array(),
					'max-pages' => array(),
				),
				'tag_spec' => array(
					'reference_points' => array(
						'AMP-NEXT-PAGE > SCRIPT[type=application/json]' => array(
							'mandatory' => true,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [footer]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [recommendation-box]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [separator]' => array(
							'mandatory' => false,
							'unique' => true,
						),
					),
					'requires_extension' => array(
						'amp-next-page',
					),
					'spec_name' => 'amp-next-page with inline config',
					'spec_url' => 'https://amp.dev/documentation/components/amp-next-page',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'deep-parsing' => array(),
					'max-pages' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'xssi-prefix' => array(),
				),
				'tag_spec' => array(
					'reference_points' => array(
						'AMP-NEXT-PAGE > SCRIPT[type=application/json]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [footer]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [recommendation-box]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [separator]' => array(
							'mandatory' => false,
							'unique' => true,
						),
					),
					'requires_extension' => array(
						'amp-next-page',
					),
					'spec_name' => 'amp-next-page with src attribute',
					'spec_url' => 'https://amp.dev/documentation/components/amp-next-page',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'data-client' => array(
						'mandatory' => true,
					),
					'data-slot' => array(
						'mandatory' => true,
					),
					'deep-parsing' => array(),
					'max-pages' => array(),
					'type' => array(
						'mandatory' => true,
						'value' => array(
							'adsense',
						),
					),
				),
				'tag_spec' => array(
					'reference_points' => array(
						'AMP-NEXT-PAGE > SCRIPT[type=application/json]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [footer]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [recommendation-box]' => array(
							'mandatory' => false,
							'unique' => true,
						),
						'AMP-NEXT-PAGE > [separator]' => array(
							'mandatory' => false,
							'unique' => true,
						),
					),
					'requires_extension' => array(
						'amp-next-page',
					),
					'spec_name' => 'amp-next-page [type=adsense]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-next-page',
					'unique' => true,
				),
			),
		),
		'amp-nexxtv-player' => array(
			array(
				'attr_spec_list' => array(
					'data-client' => array(
						'mandatory' => true,
					),
					'data-mediaid' => array(
						'mandatory' => true,
						'value_regex' => '[^=/?:]+',
					),
					'data-mode' => array(
						'value' => array(
							'api',
							'static',
						),
					),
					'data-origin' => array(
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'https',
								'http',
							),
						),
					),
					'data-streamtype' => array(
						'value' => array(
							'album',
							'audio',
							'live',
							'playlist',
							'playlist-marked',
							'video',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-nexxtv-player',
					),
				),
			),
		),
		'amp-o2-player' => array(
			array(
				'attr_spec_list' => array(
					'data-bcid' => array(
						'mandatory' => true,
					),
					'data-pid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-o2-player',
					),
				),
			),
		),
		'amp-ooyala-player' => array(
			array(
				'attr_spec_list' => array(
					'data-embedcode' => array(
						'mandatory' => true,
					),
					'data-pcode' => array(
						'mandatory' => true,
					),
					'data-playerid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-ooyala-player',
					),
				),
			),
		),
		'amp-orientation-observer' => array(
			array(
				'attr_spec_list' => array(
					'alpha-range' => array(
						'value_regex' => '(\\d+)\\s{1}(\\d+)',
					),
					'beta-range' => array(
						'value_regex' => '(\\d+)\\s{1}(\\d+)',
					),
					'gamma-range' => array(
						'value_regex' => '(\\d+)\\s{1}(\\d+)',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'smoothing' => array(
						'value_regex' => '[0-9]+|',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-orientation-observer',
					),
				),
			),
		),
		'amp-pan-zoom' => array(
			array(
				'attr_spec_list' => array(
					'disable-double-tap' => array(
						'value' => array(
							'',
						),
					),
					'initial-scale' => array(
						'value_regex' => '[0-9]+(\\.[0-9]+)?',
					),
					'initial-x' => array(
						'value_regex' => '[0-9]+',
					),
					'initial-y' => array(
						'value_regex' => '[0-9]+',
					),
					'max-scale' => array(
						'value_regex' => '[0-9]+(\\.[0-9]+)?',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'reset-on-resize' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							4,
						),
					),
					'requires_extension' => array(
						'amp-pan-zoom',
					),
				),
			),
		),
		'amp-pinterest' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'data-do' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-pinterest',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-pinterest',
				),
			),
		),
		'amp-pixel' => array(
			array(
				'attr_spec_list' => array(
					'allow-ssr-img' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'referrerpolicy' => array(
						'value' => array(
							'no-referrer',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_empty' => true,
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'defines_default_height' => true,
						'defines_default_width' => true,
						'supported_layouts' => array(
							2,
							1,
						),
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-pixel',
				),
			),
		),
		'amp-playbuzz' => array(
			array(
				'attr_spec_list' => array(
					'data-comments' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'data-item' => array(),
					'data-item-info' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'data-share-buttons' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							4,
							3,
						),
					),
					'mandatory_oneof' => array(
						'data-item',
						'src',
					),
					'requires_extension' => array(
						'amp-playbuzz',
					),
				),
			),
		),
		'amp-position-observer' => array(
			array(
				'attr_spec_list' => array(
					'intersection-ratios' => array(
						'value_regex' => '^([0]*?\\.\\d*$|1$|0$)|([0]*?\\.\\d*|1|0)\\s{1}([0]*?\\.\\d*$|1$|0$)',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'once' => array(
						'value' => array(
							'',
						),
					),
					'target' => array(),
					'viewport-margins' => array(
						'value_regex' => '^(\\d+$|\\d+px$|\\d+vh$)|((\\d+|\\d+px|\\d+vh)\\s{1}(\\d+$|\\d+px$|\\d+vh$))',
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-position-observer',
					),
				),
			),
		),
		'amp-powr-player' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-account' => array(
						'mandatory' => true,
						'value_regex' => '[0-9a-zA-Z-]+',
					),
					'data-amp-bind-data-referrer' => array(),
					'data-player' => array(
						'mandatory' => true,
						'value_regex' => '[0-9a-zA-Z-]+',
					),
					'data-terms' => array(),
					'data-video' => array(
						'value_regex' => '[0-9a-zA-Z-]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-terms',
						'data-video',
					),
					'requires_extension' => array(
						'amp-powr-player',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-powr-player',
				),
			),
		),
		'amp-reach-player' => array(
			array(
				'attr_spec_list' => array(
					'data-embed-id' => array(
						'mandatory' => true,
						'value_regex' => '[0-9a-z-]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-reach-player',
					),
				),
			),
		),
		'amp-recaptcha-input' => array(
			array(
				'attr_spec_list' => array(
					'data-action' => array(
						'mandatory' => true,
					),
					'data-sitekey' => array(
						'mandatory' => true,
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'mandatory_ancestor' => 'form',
					'requires_extension' => array(
						'amp-form',
						'amp-recaptcha-input',
					),
				),
			),
		),
		'amp-redbull-player' => array(
			array(
				'attr_spec_list' => array(
					'data-param-videoid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							3,
							4,
							6,
							7,
							8,
							9,
						),
					),
					'requires_extension' => array(
						'amp-redbull-player',
					),
				),
			),
		),
		'amp-reddit' => array(
			array(
				'attr_spec_list' => array(
					'data-embedlive' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'data-embedparent' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'data-embedtype' => array(
						'mandatory' => true,
						'value_casei' => array(
							'comment',
							'post',
						),
					),
					'data-src' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-reddit',
					),
				),
			),
		),
		'amp-riddle-quiz' => array(
			array(
				'attr_spec_list' => array(
					'data-riddle-id' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							4,
						),
					),
					'requires_extension' => array(
						'amp-riddle-quiz',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-riddle-quiz',
				),
			),
		),
		'amp-script' => array(
			array(
				'attr_spec_list' => array(
					'max-age' => array(
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'sandbox' => array(),
					'script' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-script',
					),
					'mandatory_oneof' => array(
						'script',
						'src',
					),
					'requires_extension' => array(
						'amp-script',
					),
				),
			),
		),
		'amp-selector' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-selected' => array(),
					'disabled' => array(
						'value' => array(
							'',
						),
					),
					'form' => array(),
					'keyboard-select-mode' => array(
						'value_casei' => array(
							'focus',
							'none',
							'select',
						),
					),
					'media' => array(),
					'multiple' => array(
						'value' => array(
							'',
						),
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							1,
							4,
							5,
						),
					),
					'disallowed_ancestor' => array(
						'amp-selector',
					),
					'reference_points' => array(
						'AMP-SELECTOR child' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-SELECTOR option' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
					'requires_extension' => array(
						'amp-selector',
					),
				),
			),
		),
		'amp-sidebar' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'side' => array(
						'value' => array(
							'left',
							'right',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'disallowed_ancestor' => array(
						'amp-story',
					),
					'requires_extension' => array(
						'amp-sidebar',
					),
					'spec_name' => 'amp-sidebar',
					'spec_url' => 'https://amp.dev/documentation/components/amp-sidebar',
				),
			),
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'mandatory_parent' => 'amp-story',
					'requires_extension' => array(
						'amp-sidebar',
					),
					'spec_name' => 'amp-story >> amp-sidebar',
					'spec_url' => 'https://amp.dev/documentation/components/amp-sidebar',
				),
			),
		),
		'amp-skimlinks' => array(
			array(
				'attr_spec_list' => array(
					'custom-redirect-domain' => array(),
					'custom-tracking-id' => array(
						'value_regex_casei' => '^.{0,50}$',
					),
					'excluded-domains' => array(),
					'link-selector' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'publisher-code' => array(
						'mandatory' => true,
						'value_regex_casei' => '^[0-9]+X[0-9]+$',
					),
					'tracking' => array(
						'value' => array(
							'false',
							'true',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-skimlinks',
					),
				),
			),
		),
		'amp-smartlinks' => array(
			array(
				'attr_spec_list' => array(
					'exclusive-links' => array(
						'value' => array(
							'',
						),
					),
					'link-attribute' => array(),
					'link-selector' => array(),
					'linkmate' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'nrtv-account-name' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-smartlinks',
					),
				),
			),
		),
		'amp-social-share' => array(
			array(
				'attr_spec_list' => array(
					'data-share-endpoint' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'ftp',
								'http',
								'https',
								'mailto',
								'bbmi',
								'fb-me',
								'fb-messenger',
								'intent',
								'line',
								'skype',
								'sms',
								'snapchat',
								'tel',
								'tg',
								'threema',
								'viber',
								'wh',
								'whatsapp',
							),
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-social-share',
					),
				),
			),
		),
		'amp-soundcloud' => array(
			array(
				'attr_spec_list' => array(
					'data-color' => array(
						'value_regex_casei' => '([0-9a-f]{3}){1,2}',
					),
					'data-playlistid' => array(
						'value_regex' => '[0-9]+',
					),
					'data-secret-token' => array(
						'value_regex' => '[A-Za-z0-9_-]+',
					),
					'data-trackid' => array(
						'value_regex' => '[0-9]+',
					),
					'data-visual' => array(
						'value_casei' => array(
							'false',
							'true',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-playlistid',
						'data-trackid',
					),
					'requires_extension' => array(
						'amp-soundcloud',
					),
				),
			),
		),
		'amp-springboard-player' => array(
			array(
				'attr_spec_list' => array(
					'data-content-id' => array(
						'mandatory' => true,
					),
					'data-domain' => array(
						'mandatory' => true,
					),
					'data-items' => array(
						'mandatory' => true,
					),
					'data-mode' => array(
						'mandatory' => true,
						'value_casei' => array(
							'playlist',
							'video',
						),
					),
					'data-player-id' => array(
						'mandatory' => true,
						'value_regex_casei' => '[a-z0-9]+',
					),
					'data-site-id' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-springboard-player',
					),
				),
			),
		),
		'amp-state' => array(
			array(
				'attr_spec_list' => array(
					'credentials' => array(),
					'data-amp-bind-src' => array(),
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
					'overridable' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'child_tags' => array(
						'first_child_tag_name_oneof' => array(
							'script',
						),
					),
					'requires_extension' => array(
						'amp-bind',
					),
					'spec_name' => 'amp-state',
					'spec_url' => 'https://amp.dev/documentation/components/amp-bind',
				),
			),
		),
		'amp-sticky-ad' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'child_tags' => array(
						'first_child_tag_name_oneof' => array(
							'amp-ad',
						),
						'mandatory_num_child_tags' => 1,
					),
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-sticky-ad',
					),
					'unique' => true,
				),
			),
		),
		'amp-story' => array(
			array(
				'attr_spec_list' => array(
					'background-audio' => array(
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'live-story' => array(
						'value' => array(
							'',
						),
					),
					'live-story-disabled' => array(
						'value' => array(
							'',
						),
					),
					'poster-landscape-src' => array(
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'poster-portrait-src' => array(
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'poster-square-src' => array(
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'publisher' => array(
						'mandatory' => true,
					),
					'publisher-logo-src' => array(
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'standalone' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'supports-landscape' => array(
						'value' => array(
							'',
						),
					),
					'title' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'amp-analytics',
							'amp-consent',
							'amp-geo',
							'amp-pixel',
							'amp-sidebar',
							'amp-story-auto-ads',
							'amp-story-bookend',
							'amp-story-page',
						),
						'mandatory_min_num_child_tags' => 1,
					),
					'mandatory_parent' => 'body',
					'requires_extension' => array(
						'amp-story',
					),
				),
			),
		),
		'amp-story-auto-ads' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-story',
					'requires_extension' => array(
						'amp-story-auto-ads',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-story-auto-ads',
					'unique' => true,
				),
			),
		),
		'amp-story-bookend' => array(
			array(
				'attr_spec_list' => array(
					'layout' => array(
						'mandatory' => true,
						'value' => array(
							'nodisplay',
						),
					),
					'src' => array(
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'descendant_tag_list' => 'amp-story-bookend-allowed-descendants',
					'mandatory_ancestor' => 'amp-story',
				),
			),
		),
		'amp-story-consent' => array(
			array(
				'attr_spec_list' => array(
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'script',
						),
						'mandatory_num_child_tags' => 1,
					),
					'mandatory_parent' => 'amp-consent',
					'requires_extension' => array(
						'amp-consent',
						'amp-story',
					),
				),
			),
		),
		'amp-story-cta-layer' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'descendant_tag_list' => 'amp-story-cta-layer-allowed-descendants',
					'mandatory_ancestor' => 'amp-story-page',
					'reference_points' => array(
						'AMP-STORY-CTA-LAYER animate-in' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
				),
			),
		),
		'amp-story-grid-layer' => array(
			array(
				'attr_spec_list' => array(
					'position' => array(
						'value' => array(
							'landscape-half-left',
							'landscape-half-right',
						),
					),
					'template' => array(
						'mandatory' => true,
						'value' => array(
							'fill',
							'horizontal',
							'thirds',
							'vertical',
						),
					),
				),
				'tag_spec' => array(
					'descendant_tag_list' => 'amp-story-grid-layer-allowed-descendants',
					'mandatory_ancestor' => 'amp-story-page',
					'reference_points' => array(
						'AMP-STORY-GRID-LAYER animate-in' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-STORY-GRID-LAYER default' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
				),
			),
		),
		'amp-story-page' => array(
			array(
				'attr_spec_list' => array(
					'auto-advance-after' => array(),
					'background-audio' => array(
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
					'next-page-no-ad' => array(),
				),
				'tag_spec' => array(
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'amp-analytics',
							'amp-pixel',
							'amp-story-cta-layer',
							'amp-story-grid-layer',
							'amp-story-page-attachment',
						),
						'mandatory_min_num_child_tags' => 1,
					),
					'mandatory_parent' => 'amp-story',
					'requires_extension' => array(
						'amp-story',
					),
				),
			),
		),
		'amp-story-page-attachment' => array(
			array(
				'attr_spec_list' => array(
					'layout' => array(
						'mandatory' => true,
						'value' => array(
							'nodisplay',
						),
					),
					'theme' => array(
						'value' => array(
							'dark',
							'light',
						),
					),
				),
				'tag_spec' => array(
					'descendant_tag_list' => 'amp-story-page-attachment-allowed-descendants',
					'mandatory_ancestor' => 'amp-story-page',
				),
			),
		),
		'amp-timeago' => array(
			array(
				'attr_spec_list' => array(
					'cutoff' => array(
						'value_regex' => '\\d+',
					),
					'data-amp-bind-datetime' => array(),
					'data-amp-bind-title' => array(),
					'datetime' => array(
						'mandatory' => true,
						'value_regex' => '\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d(:[0-5]\\d(\\.\\d+)?)?(Z|[+-][0-1][0-9]:[0-5][0-9])',
					),
					'locale' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							3,
							4,
						),
					),
					'requires_extension' => array(
						'amp-timeago',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-timeago',
				),
			),
		),
		'amp-truncate-text' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'overflow-style' => array(
						'value' => array(
							'right',
							'default',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							5,
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-truncate-text',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-truncate-text',
				),
			),
		),
		'amp-twitter' => array(
			array(
				'attr_spec_list' => array(
					'data-cards' => array(),
					'data-conversation' => array(),
					'data-limit' => array(),
					'data-momentid' => array(
						'value_regex' => '\\d+',
					),
					'data-timeline-id' => array(
						'value_regex' => '\\d+',
					),
					'data-timeline-owner-screen-name' => array(),
					'data-timeline-screen-name' => array(),
					'data-timeline-slug' => array(),
					'data-timeline-source-type' => array(),
					'data-timeline-url' => array(
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'data-timeline-user-id' => array(
						'value_regex' => '\\d+',
					),
					'data-tweetid' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-momentid',
						'data-timeline-source-type',
						'data-tweetid',
					),
					'requires_extension' => array(
						'amp-twitter',
					),
				),
			),
		),
		'amp-user-notification' => array(
			array(
				'attr_spec_list' => array(
					'data-dismiss-href' => array(
						'value_url' => array(
							'allow_empty' => false,
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'data-show-if-href' => array(
						'value_url' => array(
							'allow_empty' => false,
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'enctype' => array(
						'value' => array(
							'application/x-www-form-urlencoded',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-user-notification',
					),
				),
			),
		),
		'amp-video' => array(
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'alt' => array(),
					'artist' => array(),
					'artwork' => array(),
					'attribution' => array(),
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'controls' => array(
						'value' => array(
							'',
						),
					),
					'controlslist' => array(),
					'crossorigin' => array(),
					'data-amp-bind-album' => array(),
					'data-amp-bind-alt' => array(),
					'data-amp-bind-artist' => array(),
					'data-amp-bind-artwork' => array(),
					'data-amp-bind-attribution' => array(),
					'data-amp-bind-controls' => array(),
					'data-amp-bind-controlslist' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-poster' => array(),
					'data-amp-bind-preload' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'disableremoteplayback' => array(
						'value' => array(
							'',
						),
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'muted' => array(
						'value' => array(
							'',
						),
					),
					'noaudio' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'object-fit' => array(),
					'object-position' => array(),
					'placeholder' => array(),
					'poster' => array(),
					'preload' => array(
						'value' => array(
							'auto',
							'metadata',
							'none',
							'',
						),
					),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'disallowed_ancestor' => array(
						'amp-story',
					),
					'requires_extension' => array(
						'amp-video',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'alt' => array(),
					'artist' => array(),
					'artwork' => array(),
					'attribution' => array(),
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'controls' => array(
						'value' => array(
							'',
						),
					),
					'controlslist' => array(),
					'crossorigin' => array(),
					'data-amp-bind-album' => array(),
					'data-amp-bind-alt' => array(),
					'data-amp-bind-artist' => array(),
					'data-amp-bind-artwork' => array(),
					'data-amp-bind-attribution' => array(),
					'data-amp-bind-controls' => array(),
					'data-amp-bind-controlslist' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-poster' => array(),
					'data-amp-bind-preload' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'disableremoteplayback' => array(
						'value' => array(
							'',
						),
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'muted' => array(
						'value' => array(
							'',
						),
					),
					'noaudio' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'object-fit' => array(),
					'object-position' => array(),
					'placeholder' => array(),
					'poster' => array(),
					'preload' => array(
						'value' => array(
							'auto',
							'metadata',
							'none',
							'',
						),
					),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_ancestor' => 'amp-story-page-attachment',
					'requires_extension' => array(
						'amp-video',
					),
					'spec_name' => 'amp-story >> amp-story-page-attachment >> amp-video',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'alt' => array(),
					'artist' => array(),
					'artwork' => array(),
					'attribution' => array(),
					'autoplay' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'controls' => array(
						'value' => array(
							'',
						),
					),
					'controlslist' => array(),
					'crossorigin' => array(),
					'data-amp-bind-album' => array(),
					'data-amp-bind-alt' => array(),
					'data-amp-bind-artist' => array(),
					'data-amp-bind-artwork' => array(),
					'data-amp-bind-attribution' => array(),
					'data-amp-bind-controls' => array(),
					'data-amp-bind-controlslist' => array(),
					'data-amp-bind-loop' => array(),
					'data-amp-bind-poster' => array(),
					'data-amp-bind-preload' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-title' => array(),
					'disableremoteplayback' => array(
						'value' => array(
							'',
						),
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'loop' => array(
						'value' => array(
							'',
						),
					),
					'media' => array(),
					'muted' => array(
						'value' => array(
							'',
						),
					),
					'noaudio' => array(
						'value' => array(
							'',
						),
					),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'object-fit' => array(),
					'object-position' => array(),
					'placeholder' => array(),
					'poster' => array(
						'mandatory' => true,
					),
					'preload' => array(
						'value' => array(
							'auto',
							'metadata',
							'none',
							'',
						),
					),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_ancestor' => 'amp-story',
					'requires_extension' => array(
						'amp-video',
					),
					'spec_name' => 'amp-story >> amp-video',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
		),
		'amp-video-iframe' => array(
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'alt' => array(),
					'artist' => array(),
					'artwork' => array(),
					'attribution' => array(),
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-amp-bind-src' => array(),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'implements-media-session' => array(
						'value' => array(
							'',
						),
					),
					'implements-rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'poster' => array(
						'mandatory' => true,
					),
					'referrerpolicy' => array(),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-video-iframe',
					),
					'spec_name' => 'AMP-VIDEO-IFRAME[poster]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video-iframe',
				),
			),
			array(
				'attr_spec_list' => array(
					'album' => array(),
					'alt' => array(),
					'artist' => array(),
					'artwork' => array(),
					'attribution' => array(),
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-amp-bind-src' => array(),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'implements-media-session' => array(
						'value' => array(
							'',
						),
					),
					'implements-rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'referrerpolicy' => array(),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							9,
							1,
							4,
						),
					),
					'reference_points' => array(
						'AMP-VIDEO-IFRAME > [placeholder]' => array(
							'mandatory' => true,
							'unique' => true,
						),
					),
					'requires_extension' => array(
						'amp-video-iframe',
					),
					'spec_name' => 'AMP-VIDEO-IFRAME with [placeholder]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video-iframe',
				),
			),
		),
		'amp-vimeo' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(
						'value' => array(
							'',
						),
					),
					'data-videoid' => array(
						'mandatory' => true,
						'value_regex' => '[0-9]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-vimeo',
					),
				),
			),
		),
		'amp-vine' => array(
			array(
				'attr_spec_list' => array(
					'data-vineid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-vine',
					),
				),
			),
		),
		'amp-viqeo-player' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'data-profileid' => array(
						'mandatory' => true,
						'value_regex' => '[0-9a-f]*',
					),
					'data-videoid' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-viqeo-player',
					),
				),
			),
		),
		'amp-vk' => array(
			array(
				'attr_spec_list' => array(
					'data-embedtype' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-vk',
					),
				),
			),
		),
		'amp-web-push' => array(
			array(
				'attr_spec_list' => array(
					'helper-iframe-url' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'id' => array(
						'mandatory' => true,
						'value' => array(
							'amp-web-push',
						),
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'permission-dialog-url' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'service-worker-scope' => array(
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'service-worker-url' => array(
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							1,
						),
					),
					'requires_extension' => array(
						'amp-web-push',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-web-push',
				),
			),
		),
		'amp-web-push-widget' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'visibility' => array(
						'mandatory' => true,
						'value' => array(
							'blocked',
							'subscribed',
							'unsubscribed',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							2,
						),
					),
					'requires_extension' => array(
						'amp-web-push',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-web-push',
				),
			),
		),
		'amp-wistia-player' => array(
			array(
				'attr_spec_list' => array(
					'data-media-hashed-id' => array(
						'mandatory' => true,
						'value_regex' => '[0-9a-zA-Z]+',
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
					'rotate-to-fullscreen' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							4,
						),
					),
					'requires_extension' => array(
						'amp-wistia-player',
					),
				),
			),
		),
		'amp-yotpo' => array(
			array(
				'attr_spec_list' => array(
					'data-app-key' => array(
						'mandatory' => true,
					),
					'data-widget-type' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'requires_extension' => array(
						'amp-yotpo',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-yotpo',
				),
			),
		),
		'amp-youtube' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'credentials' => array(
						'value_casei' => array(
							'include',
							'omit',
						),
					),
					'data-amp-bind-data-videoid' => array(),
					'data-live-channelid' => array(
						'value_regex' => '[^=/?:]+',
					),
					'data-videoid' => array(
						'value_regex' => '[^=/?:]+',
					),
					'dock' => array(
						'requires_extension' => array(
							'amp-video-docking',
						),
					),
					'lightbox' => array(),
					'lightbox-thumbnail-id' => array(
						'value_regex_casei' => '^[a-z][a-z\\d_-]*',
					),
					'loop' => array(),
					'media' => array(),
					'noloading' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'amp_layout' => array(
						'supported_layouts' => array(
							6,
							2,
							3,
							7,
							1,
							4,
						),
					),
					'mandatory_oneof' => array(
						'data-live-channelid',
						'data-videoid',
					),
					'requires_extension' => array(
						'amp-youtube',
					),
				),
			),
		),
		'article' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'aside' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'audio' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'controls' => array(),
					'loop' => array(),
					'muted' => array(),
					'preload' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'data',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'noscript',
					'mandatory_ancestor_suggested_alternative' => 'amp-audio',
					'spec_url' => 'https://amp.dev/documentation/components/amp-audio',
				),
			),
		),
		'b' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'base' => array(
			array(
				'attr_spec_list' => array(
					'href' => array(
						'value' => array(
							'/',
						),
					),
					'target' => array(
						'value_casei' => array(
							'_blank',
							'_self',
							'_top',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'unique' => true,
				),
			),
		),
		'bdi' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'bdo' => array(
			array(
				'attr_spec_list' => array(
					'dir' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'big' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'blockquote' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'cite' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(),
			),
		),
		'body' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'html',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
		),
		'br' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'button' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'disabled' => array(
						'value' => array(
							'',
						),
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'role' => array(),
					'tabindex' => array(),
					'type' => array(),
					'value' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'open-button' => array(
						'value' => array(
							'',
						),
					),
					'role' => array(),
					'tabindex' => array(),
					'type' => array(),
					'value' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-app-banner',
					'spec_name' => 'amp-app-banner button[open-button]',
				),
			),
			array(
				'attr_spec_list' => array(
					'disabled' => array(
						'value' => array(
							'',
						),
					),
					'load-more-clickable' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'role' => array(),
					'tabindex' => array(),
					'type' => array(),
					'value' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-list-load-more',
					'requires_extension' => array(
						'amp-list',
					),
					'spec_name' => 'amp-list-load-more button[load-more-clickable]',
				),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'button amp-nested-menu',
				),
			),
		),
		'canvas' => array(
			array(
				'attr_spec_list' => array(
					'height' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-script',
					'requires_extension' => array(
						'amp-script',
					),
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/#html-tags',
				),
			),
		),
		'caption' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'center' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'circle' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'cx' => array(),
					'cy' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'r' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'cite' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'clippath' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'clippathunits' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'code' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'col' => array(
			array(
				'attr_spec_list' => array(
					'span' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'colgroup' => array(
			array(
				'attr_spec_list' => array(
					'span' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'data' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'datalist' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'dd' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'defs' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'del' => array(
			array(
				'attr_spec_list' => array(
					'cite' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'datetime' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'desc' => array(
			array(
				'attr_spec_list' => array(
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'details' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-open' => array(),
					'open' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(),
			),
		),
		'dfn' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'dir' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'div' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'verify-error' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [verify-error]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'template' => array(
						'mandatory' => true,
					),
					'verify-error' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [verify-error][template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submitting' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submitting]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submitting' => array(
						'mandatory' => true,
					),
					'template' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submitting][template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submit-success' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submit-success]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submit-success' => array(
						'mandatory' => true,
					),
					'template' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submit-success][template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submit-error' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submit-error]',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'submit-error' => array(
						'mandatory' => true,
					),
					'template' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form',
					'spec_name' => 'FORM DIV [submit-error][template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'first' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-image-slider',
					'spec_name' => 'AMP-IMAGE-SLIDER > DIV [first]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-image-slider',
				),
			),
			array(
				'attr_spec_list' => array(
					'second' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-image-slider',
					'spec_name' => 'AMP-IMAGE-SLIDER > DIV [second]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-image-slider',
				),
			),
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'fetch-error' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-list',
					'spec_name' => 'AMP-LIST DIV [fetch-error]',
				),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu' => array(),
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'amp-accordion',
					),
					'mandatory_ancestor' => 'amp-nested-menu',
					'mandatory_oneof' => array(
						'amp-nested-submenu',
						'amp-nested-submenu-close',
						'amp-nested-submenu-open',
					),
					'spec_name' => 'div amp-nested-menu',
				),
			),
		),
		'dl' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'dt' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'ellipse' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'cx' => array(),
					'cy' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'rx' => array(),
					'ry' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'em' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'fecolormatrix' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'in' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'type' => array(),
					'unicode-bidi' => array(),
					'values' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'fecomposite' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'in' => array(),
					'in2' => array(),
					'k1' => array(),
					'k2' => array(),
					'k3' => array(),
					'k4' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'operator' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'feflood' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'fegaussianblur' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'edgemode' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'in' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stddeviation' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'femerge' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'femergenode' => array(
			array(
				'attr_spec_list' => array(
					'in' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'feoffset' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'dx' => array(),
					'dy' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'in' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'result' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'fieldset' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-disabled' => array(),
					'disabled' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
				),
				'tag_spec' => array(),
			),
		),
		'figcaption' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'figure' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'filter' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'filterres' => array(),
					'filterunits' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'primitiveunits' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'footer' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'form' => array(
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accept-charset' => array(),
					'action' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'action-xhr' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'autocomplete' => array(),
					'custom-validation-reporting' => array(
						'value' => array(
							'as-you-go',
							'interact-and-submit',
							'show-all-on-submit',
							'show-first-on-submit',
						),
					),
					'enctype' => array(),
					'method' => array(
						'value_casei' => array(
							'get',
						),
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_POSITION_CONTAINED_BY|DOCUMENT_POSITION_CONTAINS|DOCUMENT_POSITION_DISCONNECTED|DOCUMENT_POSITION_FOLLOWING|DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC|DOCUMENT_POSITION_PRECEDING|DOCUMENT_TYPE_NODE|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|URL|URLUnencoded|__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|activeElement|addEventListener|adoptNode|alinkColor|all|anchors|append|appendChild|applets|baseURI|bgColor|body|captureEvents|caretPositionFromPoint|caretRangeFromPoint|characterSet|charset|childElementCount|childNodes|children|clear|cloneNode|close|compareDocumentPosition|compatMode|constructor|contains|contentType|cookie|createAttribute|createAttributeNS|createCDATASection|createComment|createDocumentFragment|createElement|createElementNS|createEvent|createExpression|createNSResolver|createNodeIterator|createProcessingInstruction|createRange|createTextNode|createTreeWalker|currentScript|defaultView|designMode|dir|dispatchEvent|doctype|documentElement|documentURI|domain|elementFromPoint|elementsFromPoint|embeds|enableStyleSheetsForSet|evaluate|execCommand|execCommandShowHelp|exitFullscreen|exitPictureInPicture|exitPointerLock|fgColor|firstChild|firstElementChild|focus|fonts|forms|fullscreen|fullscreenElement|fullscreenEnabled|getCSSCanvasContext|getElementById|getElementsByClassName|getElementsByName|getElementsByTagName|getElementsByTagNameNS|getOverrideStyle|getRootNode|getSelection|hasChildNodes|hasFocus|hasOwnProperty|hasStorageAccess|head|hidden|images|implementation|importNode|inputEncoding|insertBefore|isConnected|isDefaultNamespace|isEqualNode|isPrototypeOf|isSameNode|l10n|lastChild|lastElementChild|lastModified|lastStyleSheetSet|linkColor|links|location|lookupNamespaceURI|lookupPrefix|mozCancelFullScreen|mozFullScreen|mozFullScreenElement|mozFullScreenEnabled|mozSetImageElement|msCSSOMElementFloatMetrics|msCapsLockWarningOff|msElementsFromPoint|msElementsFromRect|nextSibling|nodeName|nodeType|nodeValue|normalize|onabort|onactivate|onafterscriptexecute|onanimationcancel|onanimationend|onanimationiteration|onanimationstart|onauxclick|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeinput|onbeforepaste|onbeforescriptexecute|onblur|oncancel|oncanplay|oncanplaythrough|onchange|onclick|onclose|oncontextmenu|oncopy|oncuechange|oncut|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragexit|ondragleave|ondragover|ondragstart|ondrop|ondurationchange|onemptied|onended|onerror|onfocus|onfreeze|onfullscreenchange|onfullscreenerror|ongotpointercapture|oninput|oninvalid|onkeydown|onkeypress|onkeyup|onload|onloadeddata|onloadedmetadata|onloadend|onloadstart|onlostpointercapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onmozfullscreenchange|onmozfullscreenerror|onmscontentzoom|onmsgesturechange|onmsgesturedoubletap|onmsgestureend|onmsgesturehold|onmsgesturestart|onmsgesturetap|onmsinertiastart|onmsmanipulationstatechanged|onmssitemodejumplistitemremoved|onmsthumbnailclick|onpaste|onpause|onplay|onplaying|onpointercancel|onpointerdown|onpointerenter|onpointerleave|onpointerlockchange|onpointerlockerror|onpointermove|onpointerout|onpointerover|onpointerup|onprogress|onratechange|onreadystatechange|onrejectionhandled|onreset|onresize|onresume|onscroll|onsearch|onseeked|onseeking|onselect|onselectionchange|onselectstart|onshow|onstalled|onstop|onsubmit|onsuspend|ontimeupdate|ontoggle|ontransitioncancel|ontransitionend|ontransitionrun|ontransitionstart|onunhandledrejection|onvisibilitychange|onvolumechange|onwaiting|onwebkitanimationend|onwebkitanimationiteration|onwebkitanimationstart|onwebkitfullscreenchange|onwebkitfullscreenerror|onwebkitmouseforcechanged|onwebkitmouseforcedown|onwebkitmouseforceup|onwebkitmouseforcewillbegin|onwebkittransitionend|onwheel|open|origin|ownerDocument|parentElement|parentNode|pictureInPictureElement|pictureInPictureEnabled|plugins|pointerLockElement|preferredStyleSheetSet|prepend|previousSibling|propertyIsEnumerable|queryCommandEnabled|queryCommandIndeterm|queryCommandState|queryCommandSupported|queryCommandText|queryCommandValue|querySelector|querySelectorAll|readyState|referrer|registerElement|releaseCapture|releaseEvents|removeChild|removeEventListener|replaceChild|requestStorageAccess|rootElement|scripts|scrollingElement|selectedStyleSheetSet|styleSheetSets|styleSheets|textContent|title|toLocaleString|toSource|toString|updateSettings|valueOf|visibilityState|vlinkColor|wasDiscarded|webkitCancelFullScreen|webkitCurrentFullScreenElement|webkitExitFullscreen|webkitFullScreenKeyboardInputAllowed|webkitFullscreenElement|webkitFullscreenEnabled|webkitHidden|webkitIsFullScreen|webkitVisibilityState|write|writeln|xmlEncoding|xmlStandalone|xmlVersion)(\\s|$)',
					),
					'novalidate' => array(),
					'target' => array(
						'mandatory' => true,
						'value_casei' => array(
							'_blank',
							'_top',
						),
					),
					'verify-xhr' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-form',
					),
					'spec_name' => 'FORM [method=GET]',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accept-charset' => array(),
					'action-xhr' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'autocomplete' => array(),
					'custom-validation-reporting' => array(
						'value' => array(
							'as-you-go',
							'interact-and-submit',
							'show-all-on-submit',
							'show-first-on-submit',
						),
					),
					'enctype' => array(),
					'method' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'post',
						),
					),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(ATTRIBUTE_NODE|CDATA_SECTION_NODE|COMMENT_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_NODE|DOCUMENT_POSITION_CONTAINED_BY|DOCUMENT_POSITION_CONTAINS|DOCUMENT_POSITION_DISCONNECTED|DOCUMENT_POSITION_FOLLOWING|DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC|DOCUMENT_POSITION_PRECEDING|DOCUMENT_TYPE_NODE|ELEMENT_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|NOTATION_NODE|PROCESSING_INSTRUCTION_NODE|TEXT_NODE|URL|URLUnencoded|__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|activeElement|addEventListener|adoptNode|alinkColor|all|anchors|append|appendChild|applets|baseURI|bgColor|body|captureEvents|caretPositionFromPoint|caretRangeFromPoint|characterSet|charset|childElementCount|childNodes|children|clear|cloneNode|close|compareDocumentPosition|compatMode|constructor|contains|contentType|cookie|createAttribute|createAttributeNS|createCDATASection|createComment|createDocumentFragment|createElement|createElementNS|createEvent|createExpression|createNSResolver|createNodeIterator|createProcessingInstruction|createRange|createTextNode|createTreeWalker|currentScript|defaultView|designMode|dir|dispatchEvent|doctype|documentElement|documentURI|domain|elementFromPoint|elementsFromPoint|embeds|enableStyleSheetsForSet|evaluate|execCommand|execCommandShowHelp|exitFullscreen|exitPictureInPicture|exitPointerLock|fgColor|firstChild|firstElementChild|focus|fonts|forms|fullscreen|fullscreenElement|fullscreenEnabled|getCSSCanvasContext|getElementById|getElementsByClassName|getElementsByName|getElementsByTagName|getElementsByTagNameNS|getOverrideStyle|getRootNode|getSelection|hasChildNodes|hasFocus|hasOwnProperty|hasStorageAccess|head|hidden|images|implementation|importNode|inputEncoding|insertBefore|isConnected|isDefaultNamespace|isEqualNode|isPrototypeOf|isSameNode|l10n|lastChild|lastElementChild|lastModified|lastStyleSheetSet|linkColor|links|location|lookupNamespaceURI|lookupPrefix|mozCancelFullScreen|mozFullScreen|mozFullScreenElement|mozFullScreenEnabled|mozSetImageElement|msCSSOMElementFloatMetrics|msCapsLockWarningOff|msElementsFromPoint|msElementsFromRect|nextSibling|nodeName|nodeType|nodeValue|normalize|onabort|onactivate|onafterscriptexecute|onanimationcancel|onanimationend|onanimationiteration|onanimationstart|onauxclick|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeinput|onbeforepaste|onbeforescriptexecute|onblur|oncancel|oncanplay|oncanplaythrough|onchange|onclick|onclose|oncontextmenu|oncopy|oncuechange|oncut|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragexit|ondragleave|ondragover|ondragstart|ondrop|ondurationchange|onemptied|onended|onerror|onfocus|onfreeze|onfullscreenchange|onfullscreenerror|ongotpointercapture|oninput|oninvalid|onkeydown|onkeypress|onkeyup|onload|onloadeddata|onloadedmetadata|onloadend|onloadstart|onlostpointercapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmouseout|onmouseover|onmouseup|onmousewheel|onmozfullscreenchange|onmozfullscreenerror|onmscontentzoom|onmsgesturechange|onmsgesturedoubletap|onmsgestureend|onmsgesturehold|onmsgesturestart|onmsgesturetap|onmsinertiastart|onmsmanipulationstatechanged|onmssitemodejumplistitemremoved|onmsthumbnailclick|onpaste|onpause|onplay|onplaying|onpointercancel|onpointerdown|onpointerenter|onpointerleave|onpointerlockchange|onpointerlockerror|onpointermove|onpointerout|onpointerover|onpointerup|onprogress|onratechange|onreadystatechange|onrejectionhandled|onreset|onresize|onresume|onscroll|onsearch|onseeked|onseeking|onselect|onselectionchange|onselectstart|onshow|onstalled|onstop|onsubmit|onsuspend|ontimeupdate|ontoggle|ontransitioncancel|ontransitionend|ontransitionrun|ontransitionstart|onunhandledrejection|onvisibilitychange|onvolumechange|onwaiting|onwebkitanimationend|onwebkitanimationiteration|onwebkitanimationstart|onwebkitfullscreenchange|onwebkitfullscreenerror|onwebkitmouseforcechanged|onwebkitmouseforcedown|onwebkitmouseforceup|onwebkitmouseforcewillbegin|onwebkittransitionend|onwheel|open|origin|ownerDocument|parentElement|parentNode|pictureInPictureElement|pictureInPictureEnabled|plugins|pointerLockElement|preferredStyleSheetSet|prepend|previousSibling|propertyIsEnumerable|queryCommandEnabled|queryCommandIndeterm|queryCommandState|queryCommandSupported|queryCommandText|queryCommandValue|querySelector|querySelectorAll|readyState|referrer|registerElement|releaseCapture|releaseEvents|removeChild|removeEventListener|replaceChild|requestStorageAccess|rootElement|scripts|scrollingElement|selectedStyleSheetSet|styleSheetSets|styleSheets|textContent|title|toLocaleString|toSource|toString|updateSettings|valueOf|visibilityState|vlinkColor|wasDiscarded|webkitCancelFullScreen|webkitCurrentFullScreenElement|webkitExitFullscreen|webkitFullScreenKeyboardInputAllowed|webkitFullscreenElement|webkitFullscreenEnabled|webkitHidden|webkitIsFullScreen|webkitVisibilityState|write|writeln|xmlEncoding|xmlStandalone|xmlVersion)(\\s|$)',
					),
					'novalidate' => array(),
					'target' => array(
						'value_casei' => array(
							'_blank',
							'_top',
						),
					),
					'verify-xhr' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'amp-app-banner',
					),
					'requires_extension' => array(
						'amp-form',
					),
					'spec_name' => 'FORM [method=POST]',
				),
			),
		),
		'g' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'glyph' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'arabic-form' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'd' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-name' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'horiz-adv-x' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'orientation' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'vert-adv-y' => array(),
					'vert-origin-x' => array(),
					'vert-origin-y' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'glyphref' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'dx' => array(),
					'dy' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'format' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'glyphref' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'h1' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'h2' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'h2 amp-nested-menu',
				),
			),
		),
		'h3' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'h3 amp-nested-menu',
				),
			),
		),
		'h4' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'h4 amp-nested-menu',
				),
			),
		),
		'h5' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'h5 amp-nested-menu',
				),
			),
		),
		'h6' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'h6 amp-nested-menu',
				),
			),
		),
		'head' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'html',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
		),
		'header' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'hgroup' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'hkern' => array(
			array(
				'attr_spec_list' => array(
					'g1' => array(),
					'g2' => array(),
					'k' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'u1' => array(),
					'u2' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'hr' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'html' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => '!doctype',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
		),
		'i' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'iframe' => array(
			array(
				'attr_spec_list' => array(
					'frameborder' => array(
						'value' => array(
							'0',
							'1',
						),
					),
					'height' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'referrerpolicy' => array(),
					'resizable' => array(
						'value' => array(
							'',
						),
					),
					'sandbox' => array(),
					'scrolling' => array(
						'value' => array(
							'auto',
							'yes',
							'no',
						),
					),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'data',
								'https',
							),
						),
					),
					'srcdoc' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'noscript',
					'mandatory_ancestor_suggested_alternative' => 'amp-iframe',
					'mandatory_oneof' => array(
						'src',
						'srcdoc',
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-iframe',
				),
			),
		),
		'image' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'preserveaspectratio' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'blacklisted_value_regex' => '(^|\\s)data:image\\/svg\\+xml',
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'data',
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'img' => array(
			array(
				'attr_spec_list' => array(
					'alt' => array(),
					'attribution' => array(),
					'border' => array(),
					'decoding' => array(
						'value' => array(
							'async',
							'auto',
							'sync',
						),
					),
					'height' => array(),
					'importance' => array(),
					'intrinsicsize' => array(),
					'ismap' => array(),
					'loading' => array(),
					'longdesc' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'sizes' => array(),
					'src' => array(
						'alternative_names' => array(
							'srcset',
						),
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'data',
								'http',
								'https',
							),
						),
					),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'noscript',
					'mandatory_ancestor_suggested_alternative' => 'amp-img',
					'spec_url' => 'https://amp.dev/documentation/components/amp-img',
				),
			),
		),
		'input' => array(
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'no-verify' => array(
						'value' => array(
							'',
						),
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'blacklisted_value_regex' => '(^|\\s)(file|image|password|)(\\s|$)',
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'no-verify' => array(
						'value' => array(
							'',
						),
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'file',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form [method=post]',
					'spec_name' => 'INPUT [type=file]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'password',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'form [method=post]',
					'spec_name' => 'INPUT [type=password]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
			array(
				'attr_spec_list' => array(
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'search',
							'text',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-autocomplete',
					'requires_extension' => array(
						'amp-form',
						'amp-autocomplete',
					),
					'spec_name' => 'amp-autocomplete > input',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'blacklisted_value_regex' => '(payment-card|date-dd-mm-yyyy|date-mm-dd-yyyy|date-mm-yy|date-yyyy-mm-dd)',
						'dispatch_key' => 1,
						'mandatory' => true,
					),
					'mask-output' => array(),
					'mask-trim-zeros' => array(
						'value_regex' => '\\d+',
					),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask] (custom mask)',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'payment-card',
						),
					),
					'mask-output' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask=payment-card]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'date-dd-mm-yyyy',
						),
					),
					'mask-output' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask=date-dd-mm-yyyy]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'date-mm-dd-yyyy',
						),
					),
					'mask-output' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask=date-mm-dd-yyyy]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'date-mm-yy',
						),
					),
					'mask-output' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask=date-mm-yy]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
			array(
				'attr_spec_list' => array(
					'accept' => array(),
					'accesskey' => array(),
					'autocomplete' => array(),
					'autofocus' => array(),
					'checked' => array(),
					'data-amp-bind-accept' => array(),
					'data-amp-bind-accesskey' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-checked' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-height' => array(),
					'data-amp-bind-inputmode' => array(),
					'data-amp-bind-max' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-min' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-size' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-step' => array(),
					'data-amp-bind-type' => array(),
					'data-amp-bind-value' => array(),
					'data-amp-bind-width' => array(),
					'disabled' => array(),
					'height' => array(),
					'inputmode' => array(),
					'list' => array(),
					'mask' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'date-yyyy-mm-dd',
						),
					),
					'mask-output' => array(),
					'max' => array(),
					'maxlength' => array(),
					'min' => array(),
					'minlength' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'selectiondirection' => array(),
					'size' => array(),
					'spellcheck' => array(),
					'step' => array(),
					'tabindex' => array(),
					'type' => array(
						'value' => array(
							'text',
							'tel',
							'search',
						),
					),
					'value' => array(),
					'width' => array(),
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-inputmask',
					),
					'spec_name' => 'input [mask=date-yyyy-mm-dd]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-inputmask',
				),
			),
		),
		'ins' => array(
			array(
				'attr_spec_list' => array(
					'cite' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'datetime' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'kbd' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'label' => array(
			array(
				'attr_spec_list' => array(
					'for' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'legend' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'li' => array(
			array(
				'attr_spec_list' => array(
					'value' => array(
						'value_regex' => '[0-9]*',
					),
				),
				'tag_spec' => array(),
			),
		),
		'line' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x1' => array(),
					'x2' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y1' => array(),
					'y2' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'lineargradient' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'gradienttransform' => array(),
					'gradientunits' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'shape-rendering' => array(),
					'spreadmethod' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x1' => array(),
					'x2' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y1' => array(),
					'y2' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'link' => array(
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(),
					'hreflang' => array(),
					'media' => array(),
					'rel' => array(
						'blacklisted_value_regex' => '(^|\\s)(canonical|components|import|manifest|preload|serviceworker|stylesheet|subresource)(\\s|$)',
						'mandatory' => true,
					),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'template',
					),
					'spec_name' => 'link rel=',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'hreflang' => array(),
					'media' => array(),
					'rel' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'canonical',
						),
					),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'head',
					'spec_name' => 'link rel=canonical',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'hreflang' => array(),
					'media' => array(),
					'rel' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'manifest',
						),
					),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'link rel=manifest',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'as' => array(),
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(),
					'hreflang' => array(),
					'media' => array(),
					'rel' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'preload',
						),
					),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'template',
					),
					'spec_name' => 'link rel=preload',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(),
					'crossorigin' => array(),
					'href' => array(
						'mandatory' => true,
						'value_regex' => 'https://cdn\\.materialdesignicons\\.com/([0-9]+\\.?)+/css/materialdesignicons\\.min\\.css|https://cloud\\.typography\\.com/[0-9]*/[0-9]*/css/fonts\\.css|https://fast\\.fonts\\.net/.*|https://fonts\\.googleapis\\.com/css\\?.*|https://fonts\\.googleapis\\.com/icon\\?.*|https://fonts\\.googleapis\\.com/earlyaccess/.*\\.css|https://maxcdn\\.bootstrapcdn\\.com/font-awesome/([0-9]+\\.?)+/css/font-awesome\\.min\\.css(\\?.*)?|https://(use|pro)\\.fontawesome\\.com/releases/v([0-9]+\\.?)+/css/(all|brands|solid|regular|light|fontawesome)\\.css|https://(use|pro)\\.fontawesome\\.com/[0-9a-zA-Z]+\\.css|https://use\\.typekit\\.net/[\\w\\p{L}\\p{N}_]+\\.css',
					),
					'integrity' => array(),
					'media' => array(),
					'nonce' => array(),
					'rel' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'stylesheet',
						),
					),
					'type' => array(
						'value_casei' => array(
							'text/css',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'link rel=stylesheet for fonts',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#custom-fonts',
				),
			),
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(
						'mandatory' => true,
					),
					'hreflang' => array(),
					'itemprop' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'sameas',
						),
					),
					'media' => array(),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'spec_name' => 'link itemprop=sameAs',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(
						'mandatory' => true,
					),
					'hreflang' => array(),
					'itemprop' => array(
						'mandatory' => true,
					),
					'media' => array(),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'spec_name' => 'link itemprop=',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'value_casei' => array(
							'utf-8',
						),
					),
					'color' => array(),
					'crossorigin' => array(),
					'href' => array(
						'mandatory' => true,
					),
					'hreflang' => array(),
					'media' => array(),
					'property' => array(
						'mandatory' => true,
					),
					'sizes' => array(),
					'target' => array(),
					'type' => array(),
				),
				'tag_spec' => array(
					'spec_name' => 'link property=',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
		),
		'listing' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'main' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'mark' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'marker' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'markerheight' => array(),
					'markerunits' => array(),
					'markerwidth' => array(),
					'mask' => array(),
					'opacity' => array(),
					'orient' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'preserveaspectratio' => array(),
					'refx' => array(),
					'refy' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'viewbox' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'mask' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'maskcontentunits' => array(),
					'maskunits' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'meta' => array(
			array(
				'attr_spec_list' => array(
					'charset' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value_casei' => array(
							'utf-8',
						),
					),
				),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'head',
					'spec_name' => 'meta charset=utf-8',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_properties' => array(
							'height' => array(),
							'initial-scale' => array(),
							'maximum-scale' => array(),
							'minimum-scale' => array(),
							'shrink-to-fit' => array(),
							'user-scalable' => array(),
							'viewport-fit' => array(),
							'width' => array(
								'mandatory' => true,
								'value' => 'device-width',
							),
						),
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'viewport',
						),
					),
				),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=viewport',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_properties' => array(
							'chrome' => array(
								'value' => '1',
							),
							'ie' => array(
								'value' => 'edge',
							),
						),
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'x-ua-compatible',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=X-UA-Compatible',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_regex' => '.*app-id=.*',
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'apple-itunes-app',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=apple-itunes-app',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-experiments-opt-in',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-experiments-opt-in',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_url' => array(
							'protocol' => array(
								'https',
							),
						),
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-3p-iframe-src',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-3p-iframe-src',
					'spec_url' => 'https://amp.dev/documentation/components/amp-ad',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-consent-blocking',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-consent-blocking',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-experiment-token',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-experiment-token',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-link-variable-allowed-origin',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-link-variable-allowed-origin',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-google-client-id-api',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-google-clientid-id-api',
				),
			),
			array(
				'attr_spec_list' => array(
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-ad-doubleclick-sra',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-ad-doubleclick-sra',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-list-load-more',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-list-load-more',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-recaptcha-input',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-recaptcha-input',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-script-src',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-script-src',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(),
					'itemprop' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(amp-.*|amp4ads-.*|apple-itunes-app|content-disposition|revisit-after|viewport)(\\s|$)',
					),
					'property' => array(),
					'scheme' => array(),
				),
				'tag_spec' => array(
					'spec_name' => 'meta name= and content=',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_casei' => array(
							'text/html; charset=utf-8',
						),
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'content-type',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=Content-Type',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'content-language',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=content-language',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'pics-label',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=pics-label',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'imagetoolbar',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=imagetoolbar',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_casei' => array(
							'text/css',
						),
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'content-style-type',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=Content-Style-Type',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_casei' => array(
							'text/javascript',
						),
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'content-script-type',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=Content-Script-Type',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'origin-trial',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=origin-trial',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'resource-type',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=resource-type',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
						'value_casei' => array(
							'off',
							'on',
						),
					),
					'http-equiv' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'x-dns-prefetch-control',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta http-equiv=x-dns-prefetch-control',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#html-tags',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-ad-enable-refresh',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'head',
					'spec_name' => 'meta name=amp-ad-enable-refresh',
				),
			),
			array(
				'attr_spec_list' => array(
					'content' => array(
						'mandatory' => true,
					),
					'name' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-to-amp-navigation',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'meta name=amp-to-amp-navigation',
					'unique' => true,
				),
			),
		),
		'metadata' => array(
			array(
				'attr_spec_list' => array(
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'meter' => array(
			array(
				'attr_spec_list' => array(
					'high' => array(),
					'low' => array(),
					'max' => array(),
					'min' => array(),
					'optimum' => array(),
					'value' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'multicol' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'nav' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'toolbar' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
					),
					'toolbar-target' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'child_tags' => array(
						'child_tag_name_oneof' => array(
							'ol',
							'ul',
						),
						'mandatory_num_child_tags' => 1,
					),
					'mandatory_parent' => 'amp-sidebar',
					'spec_name' => 'amp-sidebar > nav',
				),
			),
		),
		'nextid' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'nobr' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'noscript' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'head',
					'spec_name' => 'noscript enclosure for boilerplate',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amp-boilerplate?format=websites',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'noscript',
					),
					'mandatory_ancestor' => 'body',
				),
			),
		),
		'o:p' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'ol' => array(
			array(
				'attr_spec_list' => array(
					'reversed' => array(
						'value' => array(
							'',
						),
					),
					'start' => array(
						'value_regex' => '[0-9]*',
					),
					'type' => array(
						'value_regex' => '[1AaIi]',
					),
				),
				'tag_spec' => array(),
			),
		),
		'optgroup' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-label' => array(),
					'disabled' => array(),
					'label' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'select',
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'option' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-label' => array(),
					'data-amp-bind-selected' => array(),
					'data-amp-bind-value' => array(),
					'disabled' => array(),
					'label' => array(),
					'selected' => array(),
					'value' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'output' => array(
			array(
				'attr_spec_list' => array(
					'for' => array(),
					'form' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
				),
				'tag_spec' => array(),
			),
		),
		'p' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'path' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'd' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pathlength' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'pattern' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'patterncontentunits' => array(),
					'patterntransform' => array(),
					'patternunits' => array(),
					'pointer-events' => array(),
					'preserveaspectratio' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'viewbox' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'picture' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory_parent' => 'noscript',
					'spec_url' => 'https://amp.dev/documentation/components/amp-img',
				),
			),
		),
		'polygon' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'points' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'polyline' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'points' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'pre' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'progress' => array(
			array(
				'attr_spec_list' => array(
					'max' => array(),
					'value' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'q' => array(
			array(
				'attr_spec_list' => array(
					'cite' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_empty' => true,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
				),
				'tag_spec' => array(),
			),
		),
		'radialgradient' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'cx' => array(),
					'cy' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'fr' => array(),
					'fx' => array(),
					'fy' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'gradienttransform' => array(),
					'gradientunits' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'r' => array(),
					'shape-rendering' => array(),
					'spreadmethod' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'rb' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'rect' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'rx' => array(),
					'ry' => array(),
					'shape-rendering' => array(),
					'sketch:type' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'rp' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'rt' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'rtc' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'ruby' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		's' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'samp' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'script' => array(
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'src' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'https://cdn.ampproject.org/v0.js',
						),
					),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'contents',
						'regex' => '.',
					),
				),
				'tag_spec' => array(
					'mandatory_alternatives' => 'amphtml engine v0.js script',
					'mandatory_parent' => 'head',
					'spec_name' => 'amphtml engine v0.js script',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'src' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'https://cdn.ampproject.org/lts/v0.js',
						),
					),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'contents',
						'regex' => '.',
					),
				),
				'tag_spec' => array(
					'mandatory_alternatives' => 'amphtml engine v0.js script',
					'mandatory_parent' => 'head',
					'spec_name' => 'amphtml engine v0.js lts script',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#required-markup',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'application/ld+json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'spec_name' => 'script type=application/ld+json',
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value_casei' => array(
							'amp-rtc',
						),
					),
					'nonce' => array(),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'script id=amp-rtc',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-ima-video',
					'spec_name' => 'amp-ima-video > script[type=application/json]',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-3d-gltf',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-3q-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-access-laterpay',
						'requires_usage' => false,
						'version' => array(
							'0.1',
							'0.2',
						),
					),
					'requires_extension' => array(
						'amp-access',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-access-poool',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
					'requires_extension' => array(
						'amp-access',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-access-scroll',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
					'requires_extension' => array(
						'amp-access',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-access',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'amp-access',
						),
					),
					'nonce' => array(),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'requires_extension' => array(
						'amp-access',
					),
					'spec_name' => 'amp-access extension .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-accordion',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-action-macro',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-ad-custom',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
					'spec_name' => 'amp-ad-custom extension .js script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-ad',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
					'spec_name' => 'amp-ad extension .js script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-addthis',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-analytics',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-analytics',
					'requires_extension' => array(
						'amp-analytics',
					),
					'spec_name' => 'amp-analytics extension .json script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-analytics',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-anim',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-animation',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-animation',
					'requires_extension' => array(
						'amp-animation',
					),
					'spec_name' => 'amp-animation extension .json script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-apester-media',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-app-banner',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-audio',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-auto-ads',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-autocomplete',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-autocomplete',
					'requires_extension' => array(
						'amp-autocomplete',
					),
					'spec_name' => 'amp-autocomplete JSON',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-base-carousel',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-beopinion',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-bind',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
					'max_bytes' => 100000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/components/amp-bind#state',
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-state',
					'requires_extension' => array(
						'amp-bind',
					),
					'spec_name' => 'amp-bind extension .json script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-bind',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-bodymovin-animation',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-brid-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-brightcove',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-byside-content',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-call-tracking',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-carousel',
						'requires_usage' => true,
						'version' => array(
							'0.1',
							'0.2',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-connatix-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-consent',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-consent',
					'requires_extension' => array(
						'amp-consent',
					),
					'spec_name' => 'amp-consent extension .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-dailymotion',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-date-countdown',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-date-display',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-date-picker',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-delight-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-dynamic-css-classes',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-embedly-card',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-experiment',
						'requires_usage' => true,
						'version' => array(
							'0.1',
							'1.0',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
					'max_bytes' => 15000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/components/amp-experiment#configuration',
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-experiment',
					'spec_name' => 'amp-experiment extension .json script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-experiment',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-facebook-comments',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-facebook-like',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-facebook-page',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-facebook',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-fit-text',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-font',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-form',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-fx-collection',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-fx-flying-carpet',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-geo',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-geo',
					'requires_extension' => array(
						'amp-geo',
					),
					'spec_name' => 'amp-geo extension .json script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-geo',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-gfycat',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-gist',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-google-document-embed',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-hulu',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-iframe',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-ima-video',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-image-lightbox',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-image-slider',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-imgur',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-inline-gallery',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-inputmask',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-instagram',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-install-serviceworker',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-izlesene',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-jwplayer',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-kaltura-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-lightbox-gallery',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-lightbox',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-link-rewriter',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-link-rewriter',
					'requires_extension' => array(
						'amp-link-rewriter',
					),
					'spec_name' => 'amp-link-rewriter extension .json script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-list',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-live-list',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
					'mandatory_parent' => 'head',
					'unique_warning' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-mathml',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-mega-menu',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-megaphone',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-minute-media-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-mowplayer',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-mustache',
						'requires_usage' => true,
						'version' => array(
							'0.1',
							'0.2',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'nonce' => array(),
					'template' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'amp-mustache',
						),
					),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'text/plain',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'template',
						'amp-date-picker',
						'form div [submit-success][template]',
						'form div [submit-error][template]',
						'form div [submitting][template]',
						'form div [verify-error][template]',
					),
					'requires_extension' => array(
						'amp-mustache',
					),
					'spec_name' => 'SCRIPT type=text/plain',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-nested-menu',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-next-page',
						'requires_usage' => true,
						'version' => array(
							'0.1',
							'1.0',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-next-page',
					'requires_extension' => array(
						'amp-next-page',
					),
					'spec_name' => 'AMP-NEXT-PAGE > SCRIPT[type=application/json]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-next-page',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-nexxtv-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-o2-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-ooyala-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-orientation-observer',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-pan-zoom',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-pinterest',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-playbuzz',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-position-observer',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-powr-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-reach-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-recaptcha-input',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-redbull-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-reddit',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-riddle-quiz',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-script',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
						'mandatory' => true,
					),
					'nonce' => array(),
					'target' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'amp-script',
						),
					),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'text/plain',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
					'max_bytes' => 10000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/components/amp-script#faq',
				),
				'tag_spec' => array(
					'requires_extension' => array(
						'amp-script',
					),
					'spec_name' => 'amp-script extension local script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-selector',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-sidebar',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-skimlinks',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-smartlinks',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-social-share',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-soundcloud',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-springboard-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-sticky-ad',
						'requires_usage' => true,
						'version' => array(
							'0.1',
							'1.0',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-story-auto-ads',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-story-auto-ads',
					'requires_extension' => array(
						'amp-story-auto-ads',
					),
					'spec_name' => 'amp-story-auto-ads config script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-story-auto-ads',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-story',
						'requires_usage' => true,
						'version' => array(
							'1.0',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-story-bookend',
					'requires_extension' => array(
						'amp-story',
					),
					'spec_name' => 'amp-story-bookend extension .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-story-consent',
					'requires_extension' => array(
						'amp-consent',
						'amp-story',
					),
					'spec_name' => 'amp-story-consent extension .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'nonce' => array(),
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
					'max_bytes' => 15000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/components/amp-experiment#configuration',
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-experiment',
					'spec_name' => 'amp-experiment story extension .json script',
					'spec_url' => 'https://amp.dev/documentation/components/amp-experiment',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-subscriptions',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'amp-subscriptions',
						),
					),
					'nonce' => array(),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'requires_extension' => array(
						'amp-subscriptions',
					),
					'spec_name' => 'amp-subscriptions extension .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-subscriptions-google',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
					'requires_extension' => array(
						'amp-subscriptions',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'cryptokeys' => array(
						'dispatch_key' => 2,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'sha-256-hash' => array(
						'mandatory' => true,
					),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'application/json',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'requires_extension' => array(
						'amp-subscriptions',
					),
					'spec_name' => 'cryptokeys .json script',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'ciphertext' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
					),
					'type' => array(
						'mandatory' => true,
						'value_casei' => array(
							'application/octet-stream',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'html comments',
						'regex' => '<!--',
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'body',
					'mandatory_parent' => 'subscriptions-section content swg_amp_cache_nonce',
					'spec_name' => 'subscriptions script ciphertext',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-timeago',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-truncate-text',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-twitter',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-user-notification',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-video-docking',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
					'spec_name' => 'amp-video-docking',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-video-iframe',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-video',
						'requires_usage' => false,
						'version' => array(
							'0.1',
						),
					),
					'spec_name' => 'amp-video extension .js script',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-vimeo',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-vine',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-viqeo-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-vk',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-web-push',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-wistia-player',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-yotpo',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
					'spec_url' => 'https://amp.dev/documentation/components/amp-yotpo',
				),
			),
			array(
				'attr_spec_list' => array(
					'async' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'crossorigin' => array(
						'value' => array(
							'anonymous',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/javascript',
						),
					),
				),
				'tag_spec' => array(
					'extension_spec' => array(
						'name' => 'amp-youtube',
						'requires_usage' => true,
						'version' => array(
							'0.1',
						),
					),
				),
			),
		),
		'section' => array(
			array(
				'attr_spec_list' => array(
					'poool-access-content' => array(
						'requires_extension' => array(
							'amp-access-poool',
						),
					),
					'poool-access-preview' => array(
						'requires_extension' => array(
							'amp-access-poool',
						),
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'amp-accordion',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-data-expand' => array(),
					'expanded' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(
					'child_tags' => array(
						'first_child_tag_name_oneof' => array(
							'h1',
							'h2',
							'h3',
							'h4',
							'h5',
							'h6',
							'header',
						),
						'mandatory_num_child_tags' => 2,
					),
					'mandatory_parent' => 'amp-accordion',
					'spec_name' => 'amp-accordion > section',
				),
			),
			array(
				'attr_spec_list' => array(
					'encrypted' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
					),
					'subscriptions-section' => array(
						'value_casei' => array(
							'content',
						),
					),
					'swg_amp_cache_nonce' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'body',
					'spec_name' => 'subscriptions-section content swg_amp_cache_nonce',
				),
			),
		),
		'select' => array(
			array(
				'attr_spec_list' => array(
					'autofocus' => array(),
					'data-amp-bind-autofocus' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-multiple' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-size' => array(),
					'disabled' => array(),
					'multiple' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'no-verify' => array(
						'value' => array(
							'',
						),
					),
					'required' => array(),
					'size' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'slot' => array(
			array(
				'attr_spec_list' => array(
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
				),
				'tag_spec' => array(),
			),
		),
		'small' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'solidcolor' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'shape-rendering' => array(),
					'solid-color' => array(),
					'solid-opacity' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'source' => array(
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'sizes' => array(),
					'srcset' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'data',
								'http',
								'https',
							),
						),
					),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'picture',
					'spec_name' => 'picture > source',
					'spec_url' => 'https://amp.dev/documentation/components/amp-img',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-src' => array(),
					'data-amp-bind-type' => array(),
					'media' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-video',
					'spec_name' => 'amp-video > source',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-src' => array(),
					'data-amp-bind-type' => array(),
					'media' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-audio',
					'spec_name' => 'amp-audio > source',
					'spec_url' => 'https://amp.dev/documentation/components/amp-audio',
				),
			),
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'audio',
					'spec_name' => 'audio > source',
					'spec_url' => 'https://amp.dev/documentation/components/amp-audio',
				),
			),
			array(
				'attr_spec_list' => array(
					'media' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'video',
					'spec_name' => 'video > source',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-src' => array(),
					'data-amp-bind-type' => array(),
					'media' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => true,
							'protocol' => array(
								'https',
							),
						),
					),
					'type' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-ima-video',
					'requires_extension' => array(
						'amp-ima-video',
					),
					'spec_name' => 'amp-ima-video > source',
				),
			),
		),
		'spacer' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'span' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
			array(
				'attr_spec_list' => array(
					'amp-nested-submenu-close' => array(),
					'amp-nested-submenu-open' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'amp-nested-menu',
					'spec_name' => 'span amp-nested-menu',
				),
			),
			array(
				'attr_spec_list' => array(
					'swg_amp_cache_nonce' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'body',
					'requires_extension' => array(
						'amp-subscriptions',
					),
					'spec_name' => 'span swg_amp_cache_nonce',
				),
			),
		),
		'stop' => array(
			array(
				'attr_spec_list' => array(
					'offset' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'lineargradient',
					'spec_name' => 'lineargradient > stop',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
			array(
				'attr_spec_list' => array(
					'offset' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'radialgradient',
					'spec_name' => 'radialgradient > stop',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'strike' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'strong' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'style' => array(
			array(
				'attr_spec_list' => array(
					'amp-custom' => array(
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'nonce' => array(),
					'type' => array(
						'value_casei' => array(
							'text/css',
						),
					),
				),
				'cdata' => array(
					'blacklisted_cdata_regex' => array(
						'error_message' => 'CSS !important',
						'regex' => '!\\s*important',
					),
					'css_spec' => array(
						'allowed_at_rules' => array(
							'font-face',
							'keyframes',
							'media',
							'page',
							'supports',
						),
						'declaration' => array(),
						'font_url_spec' => array(
							'allow_empty' => true,
							'protocol' => array(
								'https',
								'http',
								'data',
							),
						),
						'image_url_spec' => array(
							'allow_empty' => true,
							'protocol' => array(
								'https',
								'http',
								'data',
								'absolute',
							),
						),
						'validate_keyframes' => false,
					),
					'max_bytes' => 75000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#maximum-size',
				),
				'tag_spec' => array(
					'mandatory_parent' => 'head',
					'spec_name' => 'style amp-custom',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#stylesheets',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'amp-boilerplate' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'nonce' => array(),
				),
				'cdata' => array(
					'cdata_regex' => '\\s*body\\s*{\\s*-webkit-animation:\\s*-amp-start\\s+8s\\s+steps\\(1,\\s*end\\)\\s+0s\\s+1\\s+normal\\s+both;\\s*-moz-animation:\\s*-amp-start\\s+8s\\s+steps\\s*\\(1\\s*,\\s*end\\s*\\)\\s+0s\\s+1\\s+normal\\s+both;\\s*-ms-animation:\\s*-amp-start\\s+8s\\s+steps\\s*\\(1\\s*,\\s*end\\s*\\)\\s+0s\\s+1\\s+normal\\s+both;\\s*animation:\\s*-amp-start\\s+8s\\s+steps\\(1,\\s*end\\)\\s+0s\\s+1\\s+normal\\s+both;?\\s*}\\s*@-webkit-keyframes\\s+-amp-start\\s*{\\s*from\\s*{\\s*visibility:\\s*hidden;?\\s*}\\s*to\\s*{\\s*visibility:\\s*visible;?\\s*}\\s*}\\s*@-moz-keyframes\\s+-amp-start\\s*{\\s*from\\s*{\\s*visibility:\\s*hidden;?\\s*}\\s*to\\s*{\\s*visibility:\\s*visible;?\\s*}\\s*}\\s*@-ms-keyframes\\s+-amp-start\\s*{\\s*from\\s*{\\s*visibility:\\s*hidden;?\\s*}\\s*to\\s*{\\s*visibility:\\s*visible;?\\s*}\\s*}\\s*@-o-keyframes\\s+-amp-start\\s*{\\s*from\\s*{\\s*visibility:\\s*hidden;?\\s*}\\s*to\\s*{\\s*visibility:\\s*visible;?\\s*}\\s*}\\s*@keyframes\\s+-amp-start\\s*{\\s*from\\s*{\\s*visibility:\\s*hidden;?\\s*}\\s*to\\s*{\\s*visibility:\\s*visible;?\\s*}\\s*}\\s*',
				),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_parent' => 'head',
					'spec_name' => 'head > style[amp-boilerplate]',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amp-boilerplate?format=websites',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'amp-boilerplate' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'nonce' => array(),
				),
				'cdata' => array(
					'cdata_regex' => '\\s*body\\s*{\\s*-webkit-animation:\\s*none;\\s*-moz-animation:\\s*none;\\s*-ms-animation:\\s*none;\\s*animation:\\s*none;?\\s*}\\s*',
				),
				'tag_spec' => array(
					'mandatory' => true,
					'mandatory_ancestor' => 'head',
					'mandatory_parent' => 'noscript',
					'spec_name' => 'noscript > style[amp-boilerplate]',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amp-boilerplate?format=websites',
					'unique' => true,
				),
			),
			array(
				'attr_spec_list' => array(
					'amp-keyframes' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
				),
				'cdata' => array(
					'css_spec' => array(
						'allowed_at_rules' => array(
							'keyframes',
							'media',
							'supports',
						),
						'declaration' => array(
							'animation-timing-function',
							'offset-distance',
							'opacity',
							'transform',
							'visibility',
						),
						'font_url_spec' => array(),
						'image_url_spec' => array(),
						'validate_keyframes' => true,
					),
					'max_bytes' => 500000,
					'max_bytes_spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#keyframes-stylesheet',
				),
				'tag_spec' => array(
					'mandatory_parent' => 'body',
					'spec_name' => 'style[amp-keyframes]',
					'unique' => true,
				),
			),
		),
		'sub' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'summary' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(
					'mandatory_parent' => 'details',
				),
			),
		),
		'sup' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'svg' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'contentscripttype' => array(),
					'contentstyletype' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'preserveaspectratio' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'version' => array(
						'value' => array(
							'1.0',
							'1.1',
						),
					),
					'viewbox' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
					'zoomandpan' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'switch' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'symbol' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'preserveaspectratio' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'viewbox' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'table' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'bgcolor' => array(),
					'border' => array(
						'value' => array(
							'0',
							'1',
						),
					),
					'cellpadding' => array(),
					'cellspacing' => array(),
					'sortable' => array(),
					'width' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'tbody' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'td' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'bgcolor' => array(),
					'colspan' => array(),
					'headers' => array(),
					'height' => array(),
					'rowspan' => array(),
					'valign' => array(),
					'width' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'template' => array(
			array(
				'attr_spec_list' => array(
					'date-template' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
						'value' => array(
							'',
						),
					),
					'dates' => array(),
					'default' => array(),
					'type' => array(
						'mandatory' => true,
						'value' => array(
							'amp-mustache',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-date-picker',
					'requires_extension' => array(
						'amp-mustache',
					),
					'spec_name' => 'amp-date-picker > template [date-template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'info-template' => array(
						'dispatch_key' => 1,
						'mandatory' => true,
					),
					'type' => array(
						'mandatory' => true,
						'value' => array(
							'amp-mustache',
						),
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-date-picker',
					'requires_extension' => array(
						'amp-mustache',
					),
					'spec_name' => 'amp-date-picker > template [info-template]',
				),
			),
			array(
				'attr_spec_list' => array(
					'id' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'type' => array(
						'mandatory' => true,
						'value' => array(
							'amp-mustache',
						),
					),
				),
				'tag_spec' => array(
					'disallowed_ancestor' => array(
						'template',
						'amp-date-picker',
						'amp-story-auto-ads',
						'form div [submit-success][template]',
						'form div [submit-error][template]',
						'form div [submitting][template]',
						'form div [verify-error][template]',
					),
					'mandatory_ancestor' => 'body',
					'requires_extension' => array(
						'amp-mustache',
					),
				),
			),
			array(
				'attr_spec_list' => array(
					'type' => array(
						'dispatch_key' => 3,
						'mandatory' => true,
						'value' => array(
							'amp-mustache',
						),
					),
				),
				'tag_spec' => array(
					'descendant_tag_list' => 'amp-story-grid-layer-allowed-descendants',
					'mandatory_parent' => 'amp-story-auto-ads',
					'reference_points' => array(
						'AMP-STORY-GRID-LAYER animate-in' => array(
							'mandatory' => false,
							'unique' => false,
						),
						'AMP-STORY-GRID-LAYER default' => array(
							'mandatory' => false,
							'unique' => false,
						),
					),
					'requires_extension' => array(
						'amp-mustache',
					),
					'spec_name' => 'amp-story-auto-ads > template',
				),
			),
		),
		'text' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'dx' => array(),
					'dy' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'lengthadjust' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'rotate' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'textlength' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'textarea' => array(
			array(
				'attr_spec_list' => array(
					'autocomplete' => array(),
					'autoexpand' => array(
						'requires_extension' => array(
							'amp-form',
						),
					),
					'autofocus' => array(),
					'cols' => array(),
					'data-amp-bind-autocomplete' => array(),
					'data-amp-bind-autofocus' => array(),
					'data-amp-bind-cols' => array(),
					'data-amp-bind-defaulttext' => array(),
					'data-amp-bind-disabled' => array(),
					'data-amp-bind-maxlength' => array(),
					'data-amp-bind-minlength' => array(),
					'data-amp-bind-pattern' => array(),
					'data-amp-bind-placeholder' => array(),
					'data-amp-bind-readonly' => array(),
					'data-amp-bind-required' => array(),
					'data-amp-bind-rows' => array(),
					'data-amp-bind-selectiondirection' => array(),
					'data-amp-bind-selectionend' => array(),
					'data-amp-bind-selectionstart' => array(),
					'data-amp-bind-spellcheck' => array(),
					'data-amp-bind-wrap' => array(),
					'disabled' => array(),
					'maxlength' => array(),
					'minlength' => array(),
					'name' => array(
						'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					),
					'no-verify' => array(
						'value' => array(
							'',
						),
					),
					'pattern' => array(),
					'placeholder' => array(),
					'readonly' => array(),
					'required' => array(),
					'rows' => array(),
					'selectiondirection' => array(),
					'selectionend' => array(),
					'selectionstart' => array(),
					'spellcheck' => array(),
					'wrap' => array(),
				),
				'tag_spec' => array(
					'spec_url' => 'https://amp.dev/documentation/components/amp-form',
				),
			),
		),
		'textpath' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'method' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'spacing' => array(),
					'startoffset' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'tfoot' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'th' => array(
			array(
				'attr_spec_list' => array(
					'abbr' => array(),
					'align' => array(),
					'bgcolor' => array(),
					'colspan' => array(),
					'headers' => array(),
					'height' => array(),
					'rowspan' => array(),
					'scope' => array(),
					'sorted' => array(),
					'valign' => array(),
					'width' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'thead' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'time' => array(
			array(
				'attr_spec_list' => array(
					'datetime' => array(),
					'pubdate' => array(
						'value' => array(
							'',
						),
					),
				),
				'tag_spec' => array(),
			),
		),
		'title' => array(
			array(
				'attr_spec_list' => array(
					'data-amp-bind-text' => array(),
				),
				'tag_spec' => array(
					'spec_name' => 'title',
				),
			),
			array(
				'attr_spec_list' => array(
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_name' => 'svg title',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'tr' => array(
			array(
				'attr_spec_list' => array(
					'align' => array(),
					'bgcolor' => array(),
					'height' => array(),
					'valign' => array(),
				),
				'tag_spec' => array(),
			),
		),
		'track' => array(
			array(
				'attr_spec_list' => array(
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'value' => array(
							'captions',
							'chapters',
							'descriptions',
							'metadata',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'audio',
					'spec_name' => 'audio > track',
				),
			),
			array(
				'attr_spec_list' => array(
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'mandatory' => true,
						'value_casei' => array(
							'subtitles',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'audio',
					'spec_name' => 'audio > track[kind=subtitles]',
				),
			),
			array(
				'attr_spec_list' => array(
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'value' => array(
							'captions',
							'chapters',
							'descriptions',
							'metadata',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'video',
					'spec_name' => 'video > track',
				),
			),
			array(
				'attr_spec_list' => array(
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'mandatory' => true,
						'value_casei' => array(
							'subtitles',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'video',
					'spec_name' => 'video > track[kind=subtitles]',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'value' => array(
							'captions',
							'chapters',
							'descriptions',
							'metadata',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-audio',
					'spec_name' => 'amp-audio > track',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'mandatory' => true,
						'value_casei' => array(
							'subtitles',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-audio',
					'spec_name' => 'amp-audio > track[kind=subtitles]',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'value' => array(
							'captions',
							'chapters',
							'descriptions',
							'metadata',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-video',
					'spec_name' => 'amp-video > track',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'mandatory' => true,
						'value_casei' => array(
							'subtitles',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-video',
					'spec_name' => 'amp-video > track[kind=subtitles]',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'value' => array(
							'captions',
							'chapters',
							'descriptions',
							'metadata',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-ima-video',
					'spec_name' => 'amp-ima-video > track',
				),
			),
			array(
				'attr_spec_list' => array(
					'data-amp-bind-label' => array(),
					'data-amp-bind-src' => array(),
					'data-amp-bind-srclang' => array(),
					'default' => array(
						'value' => array(
							'',
						),
					),
					'kind' => array(
						'mandatory' => true,
						'value_casei' => array(
							'subtitles',
						),
					),
					'label' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'mandatory' => true,
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'https',
							),
						),
					),
					'srclang' => array(
						'mandatory' => true,
					),
				),
				'tag_spec' => array(
					'mandatory_parent' => 'amp-ima-video',
					'spec_name' => 'amp-ima-video > track[kind=subtitles]',
					'spec_url' => 'https://amp.dev/documentation/components/amp-ima-video',
				),
			),
		),
		'tref' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'tspan' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'dx' => array(),
					'dy' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'lengthadjust' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'rotate' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'textlength' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'tt' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'u' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'ul' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'use' => array(
			array(
				'attr_spec_list' => array(
					'alignment-baseline' => array(),
					'baseline-shift' => array(),
					'clip' => array(),
					'clip-path' => array(),
					'clip-rule' => array(),
					'color' => array(),
					'color-interpolation' => array(),
					'color-interpolation-filters' => array(),
					'color-profile' => array(),
					'color-rendering' => array(),
					'cursor' => array(),
					'direction' => array(),
					'display' => array(),
					'dominant-baseline' => array(),
					'enable-background' => array(),
					'externalresourcesrequired' => array(),
					'fill' => array(),
					'fill-opacity' => array(),
					'fill-rule' => array(),
					'filter' => array(),
					'flood-color' => array(),
					'flood-opacity' => array(),
					'focusable' => array(),
					'font-family' => array(),
					'font-size' => array(),
					'font-size-adjust' => array(),
					'font-stretch' => array(),
					'font-style' => array(),
					'font-variant' => array(),
					'font-weight' => array(),
					'glyph-orientation-horizontal' => array(),
					'glyph-orientation-vertical' => array(),
					'height' => array(),
					'image-rendering' => array(),
					'kerning' => array(),
					'letter-spacing' => array(),
					'lighting-color' => array(),
					'marker-end' => array(),
					'marker-mid' => array(),
					'marker-start' => array(),
					'mask' => array(),
					'opacity' => array(),
					'overflow' => array(),
					'pointer-events' => array(),
					'requiredextensions' => array(),
					'requiredfeatures' => array(),
					'shape-rendering' => array(),
					'stop-color' => array(),
					'stop-opacity' => array(),
					'stroke' => array(),
					'stroke-dasharray' => array(),
					'stroke-dashoffset' => array(),
					'stroke-linecap' => array(),
					'stroke-linejoin' => array(),
					'stroke-miterlimit' => array(),
					'stroke-opacity' => array(),
					'stroke-width' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'systemlanguage' => array(),
					'text-anchor' => array(),
					'text-decoration' => array(),
					'text-rendering' => array(),
					'transform' => array(),
					'unicode-bidi' => array(),
					'vector-effect' => array(),
					'visibility' => array(),
					'width' => array(),
					'word-spacing' => array(),
					'writing-mode' => array(),
					'x' => array(),
					'xlink:actuate' => array(),
					'xlink:arcrole' => array(),
					'xlink:href' => array(
						'alternative_names' => array(
							'href',
						),
						'value_url' => array(
							'allow_empty' => false,
							'protocol' => array(
								'http',
								'https',
							),
						),
					),
					'xlink:role' => array(),
					'xlink:show' => array(),
					'xlink:title' => array(),
					'xlink:type' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'y' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'var' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
		'video' => array(
			array(
				'attr_spec_list' => array(
					'autoplay' => array(),
					'controls' => array(),
					'height' => array(),
					'loop' => array(),
					'muted' => array(),
					'playsinline' => array(),
					'poster' => array(),
					'preload' => array(),
					'src' => array(
						'blacklisted_value_regex' => '__amp_source_origin',
						'value_url' => array(
							'allow_relative' => false,
							'protocol' => array(
								'data',
								'https',
							),
						),
					),
					'width' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'noscript',
					'mandatory_ancestor_suggested_alternative' => 'amp-video',
					'spec_url' => 'https://amp.dev/documentation/components/amp-video',
				),
			),
		),
		'view' => array(
			array(
				'attr_spec_list' => array(
					'externalresourcesrequired' => array(),
					'preserveaspectratio' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'viewbox' => array(),
					'viewtarget' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
					'zoomandpan' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'vkern' => array(
			array(
				'attr_spec_list' => array(
					'g1' => array(),
					'g2' => array(),
					'k' => array(),
					'style' => array(
						'blacklisted_value_regex' => '!\\s*important',
					),
					'u1' => array(),
					'u2' => array(),
					'xml:lang' => array(),
					'xml:space' => array(),
					'xmlns' => array(),
					'xmlns:xlink' => array(),
				),
				'tag_spec' => array(
					'mandatory_ancestor' => 'svg',
					'spec_url' => 'https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml#svg',
				),
			),
		),
		'wbr' => array(
			array(
				'attr_spec_list' => array(),
				'tag_spec' => array(),
			),
		),
	);

	private static $layout_allowed_attrs = array(
		'data-amp-bind-height' => array(),
		'data-amp-bind-width' => array(),
		'height' => array(),
		'heights' => array(),
		'layout' => array(),
		'sizes' => array(),
		'width' => array(),
	);


	private static $globally_allowed_attrs = array(
		'about' => array(),
		'accesskey' => array(),
		'amp-access' => array(),
		'amp-access-behavior' => array(),
		'amp-access-hide' => array(),
		'amp-access-id' => array(),
		'amp-access-loader' => array(),
		'amp-access-loading' => array(),
		'amp-access-off' => array(),
		'amp-access-on' => array(),
		'amp-access-show' => array(),
		'amp-access-style' => array(),
		'amp-access-template' => array(),
		'amp-fx' => array(
			'requires_extension' => array(
				'amp-fx-collection',
			),
			'value_regex_casei' => '(fade-in|fade-in-scroll|float-in-bottom|float-in-top|fly-in-bottom|fly-in-left|fly-in-right|fly-in-top|parallax)(\\s|fade-in|fade-in-scroll|float-in-bottom|float-in-top|fly-in-bottom|fly-in-left|fly-in-right|fly-in-top|parallax)*',
		),
		'aria-activedescendant' => array(),
		'aria-atomic' => array(),
		'aria-autocomplete' => array(),
		'aria-busy' => array(),
		'aria-checked' => array(),
		'aria-controls' => array(),
		'aria-current' => array(),
		'aria-describedby' => array(),
		'aria-disabled' => array(),
		'aria-dropeffect' => array(),
		'aria-expanded' => array(),
		'aria-flowto' => array(),
		'aria-grabbed' => array(),
		'aria-haspopup' => array(),
		'aria-hidden' => array(),
		'aria-invalid' => array(),
		'aria-label' => array(),
		'aria-labelledby' => array(),
		'aria-level' => array(),
		'aria-live' => array(),
		'aria-multiline' => array(),
		'aria-multiselectable' => array(),
		'aria-orientation' => array(),
		'aria-owns' => array(),
		'aria-posinset' => array(),
		'aria-pressed' => array(),
		'aria-readonly' => array(),
		'aria-relevant' => array(),
		'aria-required' => array(),
		'aria-selected' => array(),
		'aria-setsize' => array(),
		'aria-sort' => array(),
		'aria-valuemax' => array(),
		'aria-valuemin' => array(),
		'aria-valuenow' => array(),
		'aria-valuetext' => array(),
		'autoscroll' => array(),
		'class' => array(
			'blacklisted_value_regex' => '(^|\\W)i-amphtml-',
		),
		'content' => array(),
		'data-amp-bind-aria-activedescendant' => array(),
		'data-amp-bind-aria-atomic' => array(),
		'data-amp-bind-aria-autocomplete' => array(),
		'data-amp-bind-aria-busy' => array(),
		'data-amp-bind-aria-checked' => array(),
		'data-amp-bind-aria-controls' => array(),
		'data-amp-bind-aria-describedby' => array(),
		'data-amp-bind-aria-disabled' => array(),
		'data-amp-bind-aria-dropeffect' => array(),
		'data-amp-bind-aria-expanded' => array(),
		'data-amp-bind-aria-flowto' => array(),
		'data-amp-bind-aria-grabbed' => array(),
		'data-amp-bind-aria-haspopup' => array(),
		'data-amp-bind-aria-hidden' => array(),
		'data-amp-bind-aria-invalid' => array(),
		'data-amp-bind-aria-label' => array(),
		'data-amp-bind-aria-labelledby' => array(),
		'data-amp-bind-aria-level' => array(),
		'data-amp-bind-aria-live' => array(),
		'data-amp-bind-aria-multiline' => array(),
		'data-amp-bind-aria-multiselectable' => array(),
		'data-amp-bind-aria-orientation' => array(),
		'data-amp-bind-aria-owns' => array(),
		'data-amp-bind-aria-posinset' => array(),
		'data-amp-bind-aria-pressed' => array(),
		'data-amp-bind-aria-readonly' => array(),
		'data-amp-bind-aria-relevant' => array(),
		'data-amp-bind-aria-required' => array(),
		'data-amp-bind-aria-selected' => array(),
		'data-amp-bind-aria-setsize' => array(),
		'data-amp-bind-aria-sort' => array(),
		'data-amp-bind-aria-valuemax' => array(),
		'data-amp-bind-aria-valuemin' => array(),
		'data-amp-bind-aria-valuenow' => array(),
		'data-amp-bind-aria-valuetext' => array(),
		'data-amp-bind-class' => array(),
		'data-amp-bind-hidden' => array(),
		'data-amp-bind-text' => array(),
		'datatype' => array(),
		'dir' => array(),
		'draggable' => array(),
		'fallback' => array(
			'value' => array(
				'',
			),
		),
		'hidden' => array(
			'value' => array(
				'',
			),
		),
		'i-amp-access-id' => array(),
		'id' => array(
			'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
		),
		'inlist' => array(),
		'itemid' => array(),
		'itemprop' => array(),
		'itemref' => array(),
		'itemscope' => array(),
		'itemtype' => array(),
		'lang' => array(),
		'next-page-hide' => array(
			'requires_extension' => array(
				'amp-next-page',
			),
		),
		'next-page-replace' => array(
			'requires_extension' => array(
				'amp-next-page',
			),
		),
		'on' => array(),
		'overflow' => array(),
		'placeholder' => array(
			'value' => array(
				'',
			),
		),
		'prefix' => array(),
		'property' => array(),
		'rel' => array(
			'blacklisted_value_regex' => '(^|\\s)(canonical|components|dns-prefetch|import|manifest|preconnect|preload|prerender|serviceworker|stylesheet|subresource)(\\s|$)',
		),
		'resource' => array(),
		'rev' => array(),
		'role' => array(),
		'slot' => array(),
		'style' => array(
			'blacklisted_value_regex' => '(!\\s*important|<!--)',
		),
		'subscriptions-action' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
		),
		'subscriptions-actions' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
			'value' => array(
				'',
			),
		),
		'subscriptions-decorate' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
		),
		'subscriptions-dialog' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
			'value' => array(
				'',
			),
		),
		'subscriptions-display' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
		),
		'subscriptions-lang' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
		),
		'subscriptions-section' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
			'value_casei' => array(
				'actions',
				'content',
				'content-not-granted',
				'loading',
			),
		),
		'subscriptions-service' => array(
			'requires_extension' => array(
				'amp-subscriptions',
			),
		),
		'tabindex' => array(),
		'title' => array(),
		'translate' => array(),
		'typeof' => array(),
		'validation-for' => array(),
		'visible-when-invalid' => array(
			'value' => array(
				'badInput',
				'customError',
				'patternMismatch',
				'rangeOverflow',
				'rangeUnderflow',
				'stepMismatch',
				'tooLong',
				'tooShort',
				'typeMismatch',
				'valueMissing',
			),
		),
		'vocab' => array(),
	);


	private static $reference_points = array(
		'AMP-BASE-CAROUSEL lightbox [child]' => array(
			'attr_spec_list' => array(
				'lightbox-thumbnail-id' => array(
					'value_regex_casei' => '^[a-z][a-z\\d_-]*',
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-BASE-CAROUSEL lightbox [child]',
			),
		),
		'AMP-BASE-CAROUSEL lightbox [lightbox-exclude]' => array(
			'attr_spec_list' => array(
				'lightbox-exclude' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-BASE-CAROUSEL lightbox [lightbox-exclude]',
			),
		),
		'AMP-CAROUSEL lightbox [child]' => array(
			'attr_spec_list' => array(
				'lightbox-thumbnail-id' => array(
					'value_regex_casei' => '^[a-z][a-z\\d_-]*',
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-CAROUSEL lightbox [child]',
			),
		),
		'AMP-CAROUSEL lightbox [lightbox-exclude]' => array(
			'attr_spec_list' => array(
				'lightbox-exclude' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-CAROUSEL lightbox [lightbox-exclude]',
			),
		),
		'AMP-LIVE-LIST [items]' => array(
			'attr_spec_list' => array(
				'items' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'reference_points' => array(
					'AMP-LIVE-LIST [items] item' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-LIVE-LIST [items]',
				'spec_url' => 'https://amp.dev/documentation/components/amp-live-list#items',
			),
		),
		'AMP-LIVE-LIST [items] item' => array(
			'attr_spec_list' => array(
				'data-sort-time' => array(
					'mandatory' => true,
				),
				'data-tombstone' => array(),
				'data-update-time' => array(),
				'id' => array(
					'blacklisted_value_regex' => '(^|\\s)(__amp_\\S*|__count__|__defineGetter__|__defineSetter__|__lookupGetter__|__lookupSetter__|__noSuchMethod__|__parent__|__proto__|__AMP_\\S*|\\$p|\\$proxy|acceptCharset|addEventListener|appendChild|assignedSlot|attachShadow|AMP|baseURI|checkValidity|childElementCount|childNodes|classList|className|clientHeight|clientLeft|clientTop|clientWidth|compareDocumentPosition|computedName|computedRole|contentEditable|createShadowRoot|enqueAction|firstChild|firstElementChild|getAnimations|getAttribute|getAttributeNS|getAttributeNode|getAttributeNodeNS|getBoundingClientRect|getClientRects|getDestinationInsertionPoints|getElementsByClassName|getElementsByTagName|getElementsByTagNameNS|getRootNode|hasAttribute|hasAttributeNS|hasAttributes|hasChildNodes|hasPointerCapture|i-amphtml-\\S*|innerHTML|innerText|inputMode|insertAdjacentElement|insertAdjacentHTML|insertAdjacentText|isContentEditable|isDefaultNamespace|isEqualNode|isSameNode|lastChild|lastElementChild|lookupNamespaceURI|namespaceURI|nextElementSibling|nextSibling|nodeName|nodeType|nodeValue|offsetHeight|offsetLeft|offsetParent|offsetTop|offsetWidth|outerHTML|outerText|ownerDocument|parentElement|parentNode|previousElementSibling|previousSibling|querySelector|querySelectorAll|releasePointerCapture|removeAttribute|removeAttributeNS|removeAttributeNode|removeChild|removeEventListener|replaceChild|reportValidity|requestPointerLock|scrollHeight|scrollIntoView|scrollIntoViewIfNeeded|scrollLeft|scrollWidth|setAttribute|setAttributeNS|setAttributeNode|setAttributeNodeNS|setPointerCapture|shadowRoot|styleMap|tabIndex|tagName|textContent|toString|valueOf|(webkit|ms|moz|o)dropzone|(webkit|moz|ms|o)MatchesSelector|(webkit|moz|ms|o)RequestFullScreen|(webkit|moz|ms|o)RequestFullscreen)(\\s|$)',
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-LIVE-LIST [items] item',
				'spec_url' => 'https://amp.dev/documentation/components/amp-live-list#items',
			),
		),
		'AMP-LIVE-LIST [pagination]' => array(
			'attr_spec_list' => array(
				'pagination' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-LIVE-LIST [pagination]',
				'spec_url' => 'https://amp.dev/documentation/components/amp-live-list#pagination',
			),
		),
		'AMP-LIVE-LIST [update]' => array(
			'attr_spec_list' => array(
				'update' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-LIVE-LIST [update]',
				'spec_url' => 'https://amp.dev/documentation/components/amp-live-list#update',
			),
		),
		'AMP-MEGA-MENU > AMP-LIST' => array(
			'attr_spec_list' => array(
				'data-amp-bind-src' => array(),
				'src' => array(),
			),
			'tag_spec' => array(
				'child_tags' => array(
					'child_tag_name_oneof' => array(
						'template',
					),
					'mandatory_num_child_tags' => 1,
				),
				'mandatory_anyof' => array(
					'data-amp-bind-src',
					'src',
				),
				'reference_points' => array(
					'AMP-MEGA-MENU > AMP-LIST > TEMPLATE' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-MEGA-MENU > AMP-LIST',
			),
		),
		'AMP-MEGA-MENU > AMP-LIST > TEMPLATE' => array(
			'attr_spec_list' => array(),
			'tag_spec' => array(
				'child_tags' => array(
					'child_tag_name_oneof' => array(
						'nav',
					),
					'mandatory_num_child_tags' => 1,
				),
				'mandatory_parent' => 'amp-list',
				'reference_points' => array(
					'AMP-MEGA-MENU > NAV' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-MEGA-MENU > AMP-LIST > TEMPLATE',
			),
		),
		'AMP-MEGA-MENU > NAV' => array(
			'attr_spec_list' => array(),
			'tag_spec' => array(
				'child_tags' => array(
					'child_tag_name_oneof' => array(
						'ol',
						'ul',
					),
					'mandatory_num_child_tags' => 1,
				),
				'reference_points' => array(
					'AMP-MEGA-MENU NAV > UL/OL' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-MEGA-MENU > NAV',
			),
		),
		'AMP-MEGA-MENU NAV > UL/OL' => array(
			'attr_spec_list' => array(),
			'tag_spec' => array(
				'child_tags' => array(
					'child_tag_name_oneof' => array(
						'li',
					),
					'mandatory_min_num_child_tags' => 1,
				),
				'mandatory_parent' => 'nav',
				'reference_points' => array(
					'AMP-MEGA-MENU NAV > UL/OL > LI' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-MEGA-MENU NAV > UL/OL',
			),
		),
		'AMP-MEGA-MENU NAV > UL/OL > LI' => array(
			'attr_spec_list' => array(),
			'tag_spec' => array(
				'child_tags' => array(
					'child_tag_name_oneof' => array(
						'a',
						'button',
						'div',
						'h1',
						'h2',
						'h3',
						'h4',
						'h5',
						'h6',
						'span',
					),
					'mandatory_min_num_child_tags' => 1,
				),
				'reference_points' => array(
					'AMP-MEGA-MENU item-content' => array(
						'mandatory' => false,
						'unique' => true,
					),
					'AMP-MEGA-MENU item-heading' => array(
						'mandatory' => true,
						'unique' => true,
					),
				),
				'spec_name' => 'AMP-MEGA-MENU NAV > UL/OL > LI',
			),
		),
		'AMP-MEGA-MENU item-content' => array(
			'attr_spec_list' => array(
				'role' => array(
					'mandatory' => true,
					'value' => array(
						'dialog',
					),
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-MEGA-MENU item-content',
			),
		),
		'AMP-MEGA-MENU item-heading' => array(
			'attr_spec_list' => array(
				'role' => array(
					'value' => array(
						'button',
					),
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-MEGA-MENU item-heading',
			),
		),
		'AMP-NEXT-PAGE > [footer]' => array(
			'attr_spec_list' => array(
				'footer' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'mandatory_parent' => 'amp-next-page',
				'spec_name' => 'AMP-NEXT-PAGE > [footer]',
			),
		),
		'AMP-NEXT-PAGE > [recommendation-box]' => array(
			'attr_spec_list' => array(
				'recommendation-box' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'mandatory_parent' => 'amp-next-page',
				'spec_name' => 'AMP-NEXT-PAGE > [recommendation-box]',
			),
		),
		'AMP-NEXT-PAGE > [separator]' => array(
			'attr_spec_list' => array(
				'separator' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'mandatory_parent' => 'amp-next-page',
				'spec_name' => 'AMP-NEXT-PAGE > [separator]',
			),
		),
		'AMP-SELECTOR child' => array(
			'attr_spec_list' => array(),
			'tag_spec' => array(
				'reference_points' => array(
					'AMP-SELECTOR child' => array(
						'mandatory' => false,
						'unique' => false,
					),
					'AMP-SELECTOR option' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-SELECTOR child',
			),
		),
		'AMP-SELECTOR option' => array(
			'attr_spec_list' => array(
				'disabled' => array(
					'value' => array(
						'',
					),
				),
				'option' => array(
					'mandatory' => true,
				),
				'selected' => array(
					'value' => array(
						'',
					),
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-SELECTOR option',
				'spec_url' => 'https://amp.dev/documentation/components/amp-selector',
			),
		),
		'AMP-STORY-CTA-LAYER animate-in' => array(
			'attr_spec_list' => array(
				'animate-in' => array(
					'value' => array(
						'drop',
						'fade-in',
						'fly-in-bottom',
						'fly-in-left',
						'fly-in-right',
						'fly-in-top',
						'pan-down',
						'pan-left',
						'pan-right',
						'pan-up',
						'pulse',
						'rotate-in-left',
						'rotate-in-right',
						'twirl-in',
						'whoosh-in-left',
						'whoosh-in-right',
						'zoom-in',
						'zoom-out',
					),
				),
				'animate-in-after' => array(),
				'animate-in-delay' => array(),
				'animate-in-duration' => array(),
				'animate-in-timing-function' => array(),
				'scale-end' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'scale-start' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'translate-x' => array(
					'value_regex_casei' => '[0-9]+px',
				),
				'translate-y' => array(
					'value_regex_casei' => '[0-9]+px',
				),
			),
			'tag_spec' => array(
				'reference_points' => array(
					'AMP-STORY-CTA-LAYER animate-in' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-STORY-CTA-LAYER animate-in',
				'spec_url' => 'https://amp.dev/documentation/components/amp-story',
			),
		),
		'AMP-STORY-GRID-LAYER animate-in' => array(
			'attr_spec_list' => array(
				'animate-in' => array(
					'value' => array(
						'drop',
						'fade-in',
						'fly-in-bottom',
						'fly-in-left',
						'fly-in-right',
						'fly-in-top',
						'pan-down',
						'pan-left',
						'pan-right',
						'pan-up',
						'pulse',
						'rotate-in-left',
						'rotate-in-right',
						'twirl-in',
						'whoosh-in-left',
						'whoosh-in-right',
						'zoom-in',
						'zoom-out',
					),
				),
				'animate-in-after' => array(),
				'animate-in-delay' => array(),
				'animate-in-duration' => array(),
				'animate-in-timing-function' => array(),
				'data-tooltip-icon' => array(
					'value_url' => array(
						'protocol' => array(
							'http',
							'https',
							'data',
						),
					),
				),
				'interactive' => array(
					'value' => array(
						'',
					),
				),
				'scale-end' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'scale-start' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'target' => array(
					'value' => array(
						'_blank',
					),
				),
				'translate-x' => array(
					'value_regex_casei' => '[0-9]+px',
				),
				'translate-y' => array(
					'value_regex_casei' => '[0-9]+px',
				),
			),
			'tag_spec' => array(
				'reference_points' => array(
					'AMP-STORY-GRID-LAYER animate-in' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-STORY-GRID-LAYER animate-in',
				'spec_url' => 'https://amp.dev/documentation/components/amp-story',
			),
		),
		'AMP-STORY-GRID-LAYER default' => array(
			'attr_spec_list' => array(
				'align-content' => array(
					'value' => array(
						'center',
						'end',
						'space-around',
						'space-between',
						'space-evenly',
						'start',
						'stretch',
					),
				),
				'align-items' => array(
					'value' => array(
						'center',
						'end',
						'start',
						'stretch',
					),
				),
				'align-self' => array(
					'value' => array(
						'center',
						'end',
						'start',
						'stretch',
					),
				),
				'animate-in' => array(
					'value' => array(
						'drop',
						'fade-in',
						'fly-in-bottom',
						'fly-in-left',
						'fly-in-right',
						'fly-in-top',
						'pan-down',
						'pan-left',
						'pan-right',
						'pan-up',
						'pulse',
						'rotate-in-left',
						'rotate-in-right',
						'twirl-in',
						'whoosh-in-left',
						'whoosh-in-right',
						'zoom-in',
						'zoom-out',
					),
				),
				'animate-in-after' => array(),
				'animate-in-delay' => array(),
				'animate-in-duration' => array(),
				'animate-in-timing-function' => array(),
				'data-tooltip-icon' => array(
					'value_url' => array(
						'protocol' => array(
							'http',
							'https',
							'data',
						),
					),
				),
				'grid-area' => array(),
				'interactive' => array(
					'value' => array(
						'',
					),
				),
				'justify-content' => array(
					'value' => array(
						'center',
						'end',
						'space-around',
						'space-between',
						'space-evenly',
						'start',
						'stretch',
					),
				),
				'justify-items' => array(
					'value' => array(
						'center',
						'end',
						'start',
						'stretch',
					),
				),
				'justify-self' => array(
					'value' => array(
						'center',
						'end',
						'start',
						'stretch',
					),
				),
				'scale-end' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'scale-start' => array(
					'value_regex' => '[0-9]+([.][0-9]+)?',
				),
				'target' => array(
					'value' => array(
						'_blank',
					),
				),
				'translate-x' => array(
					'value_regex_casei' => '[0-9]+px',
				),
				'translate-y' => array(
					'value_regex_casei' => '[0-9]+px',
				),
			),
			'tag_spec' => array(
				'reference_points' => array(
					'AMP-STORY-GRID-LAYER animate-in' => array(
						'mandatory' => false,
						'unique' => false,
					),
				),
				'spec_name' => 'AMP-STORY-GRID-LAYER default',
				'spec_url' => 'https://amp.dev/documentation/components/amp-story',
			),
		),
		'AMP-VIDEO-IFRAME > [placeholder]' => array(
			'attr_spec_list' => array(
				'placeholder' => array(
					'mandatory' => true,
				),
			),
			'tag_spec' => array(
				'spec_name' => 'AMP-VIDEO-IFRAME > [placeholder]',
				'spec_url' => 'https://amp.dev/documentation/components/amp-video-iframe',
			),
		),
	);


	/**
	 * Get allowed tags.
	 *
	 * @since 0.5
	 * @return array Allowed tags.
	 */
	public static function get_allowed_tags() {
		return self::$allowed_tags;
	}

	/**
	 * Get extension specs.
	 *
	 * @since 1.5
	 * @internal
	 * @return array Extension specs, keyed by extension name.
	 */
	public static function get_extension_specs() {
		static $extension_specs = [];

		if ( ! empty( $extension_specs ) ) {
			return $extension_specs;
		}

		foreach ( self::get_allowed_tag( 'script' ) as $script_spec ) {
			if ( isset( $script_spec[ AMP_Rule_Spec::TAG_SPEC ]['extension_spec'] ) ) {
				$extension_specs[ $script_spec[ AMP_Rule_Spec::TAG_SPEC ]['extension_spec']['name'] ] = $script_spec[ AMP_Rule_Spec::TAG_SPEC ]['extension_spec'];
			}
		}

		return $extension_specs;
	}

	/**
	 * Get allowed tag.
	 *
	 * Get the rules for a single tag so that the entire data structure needn't be passed around.
	 *
	 * @since 0.7
	 * @param string $node_name Tag name.
	 * @return array|null Allowed tag, or null if the tag does not exist.
	 */
	public static function get_allowed_tag( $node_name ) {
		if ( isset( self::$allowed_tags[ $node_name ] ) ) {
			return self::$allowed_tags[ $node_name ];
		}
		return null;
	}

	/**
	 * Get descendant tag lists.
	 *
	 * @since 1.1
	 * @return array Descendant tags list.
	 */
	public static function get_descendant_tag_lists() {
		return self::$descendant_tag_lists;
	}

	/**
	 * Get allowed descendant tag list for a tag.
	 *
	 * Get the descendant rules for a single tag so that the entire data structure needn't be passed around.
	 *
	 * @since 1.1
	 * @param string $name Name for the descendants list.
	 * @return array|bool Allowed tags list, or false if there are no restrictions.
	 */
	public static function get_descendant_tag_list( $name ) {
		if ( isset( self::$descendant_tag_lists[ $name ] ) ) {
			return self::$descendant_tag_lists[ $name ];
		}
		return false;
	}

	/**
	 * Get reference point spec.
	 *
	 * @since 1.0
	 * @param string $tag_spec_name Tag spec name.
	 * @return array|null Reference point spec, or null if does not exist.
	 */
	public static function get_reference_point_spec( $tag_spec_name ) {
		if ( isset( self::$reference_points[ $tag_spec_name ] ) ) {
			return self::$reference_points[ $tag_spec_name ];
		}
		return null;
	}

	/**
	 * Get list of globally-allowed attributes.
	 *
	 * @since 0.5
	 * @return array Allowed tag.
	 */
	public static function get_allowed_attributes() {
		return self::$globally_allowed_attrs;
	}

	/**
	 * Get layout attributes.
	 *
	 * @since 0.5
	 * @return array Allowed tag.
	 */
	public static function get_layout_attributes() {
		return self::$layout_allowed_attrs;
	}

}

